考虑以下“消息”表:
_date message
-------------------------
2012-02-22 hello
2012-02-22 another msg!
2012-03-05 foobar
2012-03-22 testing
2012-03-22 goodbye
2012-03-22 test test
我想计算每天的邮件数量,但也希望包括没有邮件的所有日期。假设我想计算2012-02-01和2012-03-29之间的所有消息,那么查询结果应为:
_date messsages
----------------------
2012-02-01 0
2012-02-02 0
...
2012-02-22 2
2012-02-23 0
...
2012-03-01 0
2012-03-02 0
2012-03-03 0
2012-03-04 0
2012-03-05 1
...
2012-03-22 3
...
2012-03-29 0
这在MySQL中是否可行?
答案 0 :(得分:2)
这样的事情应该这样做 -
SELECT date_range.`date`, COUNT(messages._date)
FROM (
SELECT '2012-02-01' + INTERVAL (id - 1) DAY AS `date`
FROM dummy
WHERE id BETWEEN 1 AND 58
ORDER BY id ASC
) AS date_range
LEFT JOIN messages
ON date_range.`date` = messages._date
GROUP BY date_range.`date` ASC
对于此示例,dummy是具有基于整数的id字段的任何表,其中包含覆盖所需日期范围的连续集。在这种情况下,您需要1到58的ID。
答案 1 :(得分:0)
如所示here,您将需要使用一个存储过程,该存储过程将创建范围内所有日期的临时表,并将消息表连接到该表。您无法从没有它们的表中返回记录。
答案 2 :(得分:0)
我在这里找到了一个类似的解决方案,使用了关键字BETWEEN。我之前没有亲自在SQL中使用BETWEEN,但看起来很有希望。我不确定它是否会在表中不存在的日子里计算0,但它可能会让你开始至少。
他们还提到了一个更丑陋的方法,即使用“辅助”表来对抗JOIN;这肯定会让你得到0计数,但在我看来会有点混乱。如果您决定走这条路线,我建议您尝试使用CREATE TEMPORARY TABLE来临时表。
答案 3 :(得分:0)
如果您没有经常运行此查询,或者如果您不希望(或不能)创建一个新表连接,则可以在此question中动态生成数据。