按天分组仍然显示没有行的天数?

Fer*_*ndo 4 mysql

我有一个日志表,其中包含一个名为logTime的日期字段.我需要显示日期范围内的行数和每天的记录数.问题是我仍然希望显示没有记录的日子.

是否可以仅使用SQL执行此操作?

例:

SELECT logTime, COUNT(*) FROM logs WHERE logTime >= '2011-02-01' AND logTime <= '2011-02-04' GROUP BY DATE(logTime);

它返回如下内容:

+---------------------+----------+
| logTime             | COUNT(*) |
+---------------------+----------+
| 2011-02-01          |        2 |
| 2011-02-02          |        1 |
| 2011-02-04          |        5 |
+---------------------+----------+
3 rows in set (0,00 sec)

我想展示2011-02-03那天.

gah*_*ooa 5

为了实现这一点,你需要有一个表(或派生表),它包含你可以使用LEFT JOIN加入的日期.

SQL运用数学集的概念,如果你没有一组数据,就没有什么可以选择的.

如果您想了解更多详情,请相应评论.


Ano*_*nym 5

MySQL不会为您创建行,因此如果数据不存在,它们将自然不会显示.

您可以创建一个日历表,并加入其中,

create table calendar (
    day date primary key,
);
Run Code Online (Sandbox Code Playgroud)

填写此表与日期(很容易使用存储过程,或只是一些通用脚本),直到大约2038年左右,其他东西可能会破坏unitl成为一个问题.

然后您的查询变为例如

SELECT logTime, COUNT(*) 
  FROM calendar cal left join logs l on cal.day = l.logTime 
WHERE day >= '2011-02-01' AND day <= '2011-02-04' GROUP BY day;
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用其他列来扩展日历表,这些列会告诉您月,年,周等,以便您可以轻松生成其他时间单位的统计信息.(纯粹主义者可能认为日历表会有一个id整数主键,日志表引用而不是日期)