0

考虑以下“消息”表:

_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

4 回答 4

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。

于 2012-03-29T15:32:30.880 回答
0

如此处所示,您将需要使用存储过程来创建该范围内所有日期的临时表并将消息表连接到该表。您不能从没有记录的表中返回记录。

于 2012-03-29T15:31:44.873 回答
0

我在这里的另一个答案中使用关键字 BETWEEN 找到了一个可能类似的解决方案。我以前没有亲自在 SQL 中使用过 BETWEEN,但它看起来很有希望。我不确定它是否会将表中不存在的天数计为 0,但它至少可以让你开始。

他们还提到了一种更丑陋的方法,即使用“帮助”表来对抗 JOIN;这肯定会让你得到 0 计数,但在我看来会有点混乱。如果您决定走那条路,我建议您尝试使用 CREATE TEMPORARY TABLE 的临时表。

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

于 2012-03-29T15:41:53.707 回答
0

如果您不经常运行此查询,或者您不想(或不能)创建一个新表以进行左连接,则可以按照此问题中的说明动态生成数据。

于 2012-03-29T15:42:40.913 回答