我有一个日志表,其中包含一个名为 logTime 的日期字段。我需要显示日期范围内的行数以及每天的记录数。问题是我仍然想展示那些日子没有记录.
是否可以仅使用 SQL 来完成此操作?
Example:
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这一天。
MySQL不会为你创建行,所以如果数据不存在,它们自然不会显示。
您可以创建一个日历表,然后加入其中,
create table calendar (
day date primary key,
);
用日期填充此表(使用存储过程很容易,或者只是一些通用脚本),直到 2038 年左右,其他东西可能会破坏单元,从而成为问题。
然后你的查询就变成了
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;
现在,您可以使用其他列来扩展日历表,告诉您月、年、周等,以便您可以轻松生成其他时间单位的统计数据。 (纯粹主义者可能会认为日历表将有一个 id 整数主键,日志表引用该主键而不是日期)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)