mysql лучший способ подсчета заказов, упорядоченных по статусу

#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 сек