Задать вопрос
@vardz

Как получить 3 массива из одного запроса?

Есть mysql таблица, в которой всего 2 поля user и status. user-ов будет не более 150, а status-ов всего 3 со значениями 0, 1 или 9
примерный вид
user status
name1 0
name6 0
name9 0
name2 1
name5 1
name6 1
name7 9
name8 9
name3 9

Хотелось бы понять, как вместо 3 запросов к бд вида
SELECT user, status FROM `user_status` WHERE status = "0"
SELECT user, status FROM `user_status` WHERE status = "1"
SELECT user, status FROM `user_status` WHERE status = "9"


сделать один запрос вида
Насколько я понимаю, 1 запросом
$result = mysqli_query($conn, "SELECT user, status FROM user_status");
и потом выхлоп привести к 3 простым массивам в php вида
$user_status_0_array = ["name1", "name6", "name9"];
$user_status_1_array = ["name2", "name5", "name6"];
$user_status_9_array = ["name7", "name8", "name3"];


p.s. php8x
  • Вопрос задан
  • 191 просмотр
Подписаться 2 Простой 5 комментариев
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Skillbox
    Профессия PHP-разработчик с нуля до PRO
    7 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 5
@Everything_is_bad
продолжай учить основы sql, ну и не прибегай сюда с такой элементарщий, тебе даже тупые LLM без проблем породят ответ.
Ответ написан
Комментировать
@Akina
Сетевой и системный админ, SQL-программист.
На стороне MySQL (при необходимости - скорректировать @@group_concat_max_len):
SELECT status, GROUP_CONCAT(user) userlist
FROM user_status
GROUP BY status

На стороне PHP (синтаксиса не знаю, схематично):
if $row['status'] = 1 then $user_status_1_array=split_to_array($row['userlist'])
Ответ написан
да, правильно мыслите - в цикле, который будет построчно обрабатывать $result, проверяете и добавляете в нужный массив:
while ($row = $result->fetch_assoc()) {
    switch( $row['status'] ) {
         // тут кейсы
    }
}

Когда заработает, подумайте вот о чем:
1) зачем вам такие длинные и неинформативные имена вроде $user_status_0_array? То, что это массив, подскажет IDE.
2) нужно ли тут три массива, или лучше использовать один многоуровневый?
$users = [
   0 => ["name1", "name6", "name9"],
   1 => ["name2", "name5", "name6"],
   2 => ["name7", "name8", "name3"],
];
Ответ написан
Комментировать
@vardz Автор вопроса
вроде вот так получилось
$user_status_0_array = [];
$user_status_1_array = [];
$user_status_9_array = [];

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$user_status_result  = $conn->query("SELECT users, status FROM user_status");
while ($row = $user_status_result->fetch_assoc()) {
    if ($row['status'] == '0') { $user_status_0_array[] = $row['users']; }
    if ($row['status'] == '1') { $user_status_1_array[] = $row['users']; }
    if ($row['status'] == '9') { $user_status_9_array[] = $row['users']; }
}

print_r($user_status_0_array);

if (in_array("name2", $user_status_0_array)) {
        echo "YES";
    } else {
     echo "NO";
    }


Михаил, Акина.. спасибо большое
p.s. неинформативные имена вроде $user_status_0_array - это я так назвал, чтоб тут понятней было =)
Ответ написан
W1DO_DIGITAL
@W1DO_DIGITAL
Senior Tech Lead | AI Solution Architect | Founder
Выполните запрос без условий и итерируйте результат, используя значение статуса как ключ для динамического формирования подмассивов. В цикле while через fetch_assoc добавляйте имя пользователя в массив вида $data[$row['status']][], что автоматически сгруппирует их по категориям. После завершения цикла вы получите структурированный массив, где элементы доступны по индексам 0, 1 и 9 без лишних обращений к СУБД.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы