【问题标题】:get result of non-existent dates too也得到不存在日期的结果
【发布时间】:2016-08-07 15:08:17
【问题描述】:

我有一个 MySql 表,其中包含具有 DATETIME 时间戳的事件。我想计算每天的事件。在某些日子,例如周日,缺少活动。结果也应该包含这些天,计数为零。

我的查询如下:

SELECT 

COUNT(1) AS mycount,
DATE_FORMAT(DATE(evaluations.timestamp),"%a, %d.%m.%Y") AS date
FROM Events 
GROUP BY DATE(timestamp)
ORDER BY DATE(timestamp) DESC

我可以在不使用包含所有日期的帮助表的情况下修改查询吗? 一个查询(没有过程,没有函数)就可以了。

【问题讨论】:

  • 最简单的解决方案是为此目的创建一个Calendar 表。

标签: mysql sql


【解决方案1】:

如果您没有任何calendar 表,查询会以某种方式看起来像这样:

SELECT 
 dateTable.day,
 COALESCE(t.mycount,0) AS cnt
FROM 
(
SELECT ADDDATE((SELECT MIN(DATE(timestamp)) FROM Events), INTERVAL @i:=@i+1 DAY) AS DAY
FROM (
SELECT a.a
FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
) a
JOIN (SELECT @i := -1) r1
WHERE 
@i < DATEDIFF((SELECT MAX(DATE(timestamp)) FROM Events), (SELECT MIN(DATE(timestamp)) FROM Events))
) AS dateTable
LEFT JOIN 
(
        SELECT 
        COUNT(1) AS mycount,
        DATE_FORMAT(DATE(evaluations.timestamp),"%a, %d.%m.%Y") AS date
        FROM Events 
        GROUP BY DATE(timestamp)
        ORDER BY DATE(timestamp) DESC
) AS t
ON dateTable.day = t.date
ORDER BY dateTable.day DESC;

注意:

如果您认为您会经常需要这种查询,那么您可以创建一个包含所有日期的表。 可以通过mysql event 定期添加较新的日期

那么工作就简单了。只需要在calendar 表和查询结果之间创建一个LEFT JOIN

【讨论】:

  • 如果有内置日历表就好了。
  • 很遗憾没有这样的功能。你必须实现它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 2022-08-14
相关资源
最近更新 更多