Как включить 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

Вам нужно будет присоединиться к списку дат. Вы можете создать таблицу с необходимыми датами, или вы можете использовать динамический подход, который я изложил здесь:

генерировать дни из диапазона дат