#php #mysql
#php #mysql
Вопрос:
Для моей панели я обновляю свои «кнопки статуса» с помощью count-numbers.
Например, новых 2, резервных 5, отмененных 3, отправлено 201
В конце я теперь считаю их следующим образом:
while($status = mysqli_fetch_array($query)){
$countSQL = $mysqli->query("SELECT id FROM orders WHERE status=".$status['id']." AND user=".$user);
$countStatus = mysqli_num_rows($countSQL);
// etc...
}
Я знаю… «Используйте подготовленные инструкции»… Я сделаю это в обновленной версии моего скрипта 🙂
Но есть ли более простой способ получить все заказы от этого конкретного пользователя, а затем просто получить сумму за «статус»?
Я уже тестировал приведенный ниже, но в среднем разница составляет 0,000024 против 0,000034. Так что это быстрее, но я думаю (и надеюсь), что есть лучший способ?
SELECT
SUM( CASE WHEN status = '1' THEN 1 ELSE 0 END ) AS one,
SUM( CASE WHEN status = '2' THEN 1 ELSE 0 END ) AS two,
SUM( CASE WHEN status = '3' THEN 1 ELSE 0 END ) AS three,
SUM( CASE WHEN status = '4' THEN 1 ELSE 0 END ) AS four,
SUM( CASE WHEN status = '5' THEN 1 ELSE 0 END ) AS five,
SUM( CASE WHEN status = '6' THEN 1 ELSE 0 END ) AS six,
SUM( CASE WHEN status = '7' THEN 1 ELSE 0 END ) AS seven,
SUM( CASE WHEN status = '8' THEN 1 ELSE 0 END ) AS eight,
SUM( CASE WHEN status = '9' THEN 1 ELSE 0 END ) AS nine,
SUM( CASE WHEN status = '10' THEN 1 ELSE 0 END ) AS ten,
SUM( CASE WHEN status = '11' THEN 1 ELSE 0 END ) AS eleven
FROM orders
WHERE user=$user
Кроме того, верхний способ не так полезен, когда будут доступны новые статусы (12,13, …).
Комментарии:
1. Вы думали о том, чтобы просто использовать
GROUP BY status
?2. Можете ли вы подробнее объяснить свои входные данные и желаемый результат?
3. Первый выполняет запрос в цикле, который не будет хорошо масштабироваться. Второй очень жестко запрограммирован, что, если вы получите статус 12, 13 или 14? Просто посчитайте строки с помощью
GROUP BY status
Ответ №1:
Вы можете использовать group by
, когда значение статуса является динамическим
SELECT id, status, count(id) as total FROM orders WHERE user='userid' GROUP by status
Комментарии:
1. Это намного лучше. Результат для этого запроса = 0.000017сек. сначала мой «sum» — запрос = 0.000024 сек. (активный запрос = 0.000038 сек