Как включить GROUP BY и COUNT с нулевыми суммами?
У меня такой SQL (где $ytoday
- 5 дней назад):
$sql = 'SELECT Count(*), created_at FROM People WHERE created_at >= "'. $ytoday .'" AND GROUP BY DATE(created_at)';
Я хочу, чтобы это возвращало значение для каждого дня, поэтому оно вернет 5 результатов в этом случае (5 дней назад до сегодняшнего дня).
Но скажем, что Count(*)
равен 0 вчера, вместо того, чтобы возвращать нуль, он не возвращает никаких данных вообще для этой даты.
Как я могу изменить этот запрос SQLite, чтобы он также возвращал данные с числом 0?
Ответы
Ответ 1
Без запутанных (по-моему) запросов ваш выходной набор данных не будет включать даты, которые не существуют в вашем исходном наборе данных. Это означает, что вам нужен набор данных с 5 днями для присоединения к.
Простой вариант - создать таблицу с 5 датами и присоединиться к ней. Я обычно создаю и сохраняю (эффективно кэширую) таблицу календаря с каждой датой, когда-либо мне понадобившейся. (Например, с 1900-01-01 по 2099-12-31.)
SELECT
calendar.calendar_date,
Count(People.created_at)
FROM
Calendar
LEFT JOIN
People
ON Calendar.calendar_date = People.created_at
WHERE
Calendar.calendar_date >= '2012-05-01'
GROUP BY
Calendar.calendar_date
Ответ 2
Вам нужно будет присоединиться к списку дат. Вы можете создать таблицу с необходимыми датами, или вы можете использовать динамический подход, который я изложил здесь:
генерировать дни из диапазона дат