mysql — SQL PHP подсчитывает данные между двумя группами дат по дням и показывает записи по дням

У меня проблема с моим кодом SQL,
Вот код:

SELECT
COUNT(CASE WHEN ItemState = 1 THEN 1 ELSE NULL END) AS C1,
COUNT(CASE WHEN ItemState = 3 THEN 1 ELSE NULL END) AS C2,
COUNT(CASE WHEN ItemState = 5 THEN 1 ELSE NULL END) AS C3,
COUNT(CASE WHEN ItemState = 7 THEN 1 ELSE NULL END) AS C4,
COUNT(CASE WHEN ItemState = 10 THEN 1 ELSE NULL END) AS C5,
DAY(LastUpdate) AS Day
FROM purchasehistory
WHERE ItemID=77
AND LastUpdate BETWEEN "2017-10-25 00:00:00" AND "2017-10-30 23:59:59"GROUP BY Day
ORDER BY LastUpdate
LIMIT 5

Оператор подсчета — это работа, но результат не тот, который я хотел

Вот результат

введите описание изображения здесь

Он должен показывать пять записей, где день равен 25, 26, 27, 28, 29, 30

Но когда c1, c2, c3, c4 и c5 равны 0, строка не показывает вместо 0

Как решить проблему?

-2

Решение

Я считаю, что во многих случаях простой способ исправить это — перенести некоторые условия фильтра в case условия:

SELECT SUM(ItemID = 77 AND ItemState = 1) AS C1,
SUM(ItemID = 77 AND ItemState = 3) AS C2,
SUM(ItemID = 77 AND ItemState = 5) AS C3,
SUM(ItemID = 77 AND ItemState = 7) AS C4,
SUM(ItemID = 77 AND ItemState = 10) AS C5,
DAY(LastUpdate) AS Day
FROM purchasehistory
WHERE LastUpdate >= '2017-10-25' AND LastUpdate < '2017-10-31'
GROUP BY Day
ORDER BY MIN(LastUpdate)
LIMIT 5;

Это предполагает, что в каждый день есть как минимум один продукт.

Более типичным решением является использование LEFT JOIN — и это может быть лучше с точки зрения производительности. Я просто считаю, что вышеуказанный подход является более быстрым способом получения желаемых результатов.

Некоторые другие заметки:

  • MySQL рассматривает булевы выражения как числа в числовом контексте с «1» для true. Вам не нужен CASE,
  • Стандарт ANSI для разделителей строк — это одинарные, а не двойные кавычки.
  • Логика дат проще с использованием дат. Не нужно беспокоиться о том, когда последняя транзакция происходит в тот или иной день.
  • Почему вы используете LIMIT 5 если вы выбираете данные за шесть дней?
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector