Как объединить три SQL-запроса в один с группировкой результатов в PHP

    Рассмотрим задачу оптимизации работы с базой данных MySQL. Имеется таблица user_status со следующей структурой:

    • user - имя пользователя (всего не более 150 записей)
    • status - статус пользователя, принимающий одно из трёх значений: 0, 1 или 9

    Пример данных в таблице:

    userstatus
    name10
    name60
    name90
    name21
    name51
    name61
    name79
    name89
    name39

    Вместо выполнения трёх отдельных запросов для каждого статуса:

    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"

    можно использовать один универсальный запрос, который извлекает все данные сразу:

    $result = mysqli_query($conn, "SELECT user, status FROM user_status");

    После получения результатов их нужно сгруппировать в PHP. Вот пример реализации для PHP 8.x:

    $user_status_0_array = [];
    $user_status_1_array = [];
    $user_status_9_array = [];
    
    while ($row = mysqli_fetch_assoc($result)) {
        switch ($row['status']) {
            case '0':
                $user_status_0_array[] = $row['user'];
                break;
            case '1':
                $user_status_1_array[] = $row['user'];
                break;
            case '9':
                $user_status_9_array[] = $row['user'];
                break;
        }
    }
    
    // Результат:
    // $user_status_0_array = ["name1", "name6", "name9"];
    // $user_status_1_array = ["name2", "name5", "name6"];
    // $user_status_9_array = ["name7", "name8", "name3"];

    Этот подход имеет несколько преимуществ:

    • Сокращение количества запросов к БД с трёх до одного
    • Уменьшение нагрузки на сервер базы данных
    • Упрощение кода и улучшение его читаемости
    • Повышение производительности при работе с небольшими объёмами данных (до 150 записей)

    Для больших таблиц рекомендуется добавить индексы на поле status и рассмотреть возможность пагинации данных.