我有一个日志表,其中包含一个名为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那天.
为了实现这一点,你需要有一个表(或派生表),它包含你可以使用LEFT JOIN加入的日期.
SQL运用数学集的概念,如果你没有一组数据,就没有什么可以选择的.
如果您想了解更多详情,请相应评论.
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整数主键,日志表引用而不是日期)
| 归档时间: |
|
| 查看次数: |
2687 次 |
| 最近记录: |