Как объединить три 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 и рассмотреть возможность пагинации данных.