小编典典

如何让GROUP BY和COUNT包含零和?

sql

我有这样的SQL($ytoday5天前在哪里):

$sql = 'SELECT Count(*), created_at FROM People WHERE created_at >= "'. $ytoday .'" AND GROUP BY DATE(created_at)';

我希望它每天返回一个值,因此在这种情况下(5天前到今天)它将返回5个结果。

但是,如果说Count(*)昨天是0,则不会返回该日期的所有数据,而是返回零。

如何更改该SQLite查询,使其还返回计数为0的数据?


阅读 206

收藏
2021-05-16

共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
2021-05-16