Как объединить три SQL-запроса в один с группировкой результатов в PHP
Рассмотрим задачу оптимизации работы с базой данных MySQL. Имеется таблица user_status со следующей структурой:
- user - имя пользователя (всего не более 150 записей)
- status - статус пользователя, принимающий одно из трёх значений: 0, 1 или 9
Пример данных в таблице:
| user | status |
|---|---|
| name1 | 0 |
| name6 | 0 |
| name9 | 0 |
| name2 | 1 |
| name5 | 1 |
| name6 | 1 |
| name7 | 9 |
| name8 | 9 |
| name3 | 9 |
Вместо выполнения трёх отдельных запросов для каждого статуса:
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 и рассмотреть возможность пагинации данных.