如何在数据库中没有记录的MySQL结果中添加日期?

时间:2012-03-29 15:22:30

标签: mysql sql gaps-and-islands

考虑以下“消息”表:

_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中是否可行?

4 个答案:

答案 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来临时表。

https://stackoverflow.com/a/895185/1301139

答案 3 :(得分:0)

如果您没有经常运行此查询,或者如果您不希望(或不能)创建一个新表连接,则可以在此question中动态生成数据。