MYSQL按小时分组 - 显示零结果

时间:2014-11-26 10:29:01

标签: mysql

我正在尝试生成一个按小时返回结果的查询,该查询也显示零结果。

目前,MYSQL语句仅显示结果存在而不是现有结果且结果为零的结果。

MYSQL SO FAR

SELECT DATE(received) as Date, 
CONCAT(HOUR(received), ':00-', HOUR(received)+1, ':00') AS Hours, 
IFNULL(COUNT(*), 0) as Leads from digital_lead
where `received` BETWEEN '2014-11-01' AND '2014-11-25'
GROUP BY DATE(received), HOUR(received)

目前,这显示日期范围内的每一天除以小时数,仅显示该小时位的lead。我希望显示每天的所有小时数,即使那小时内没有lead数据。

示例

DATE         HOUR SLOT         LEADS 
2014-11-01   00:00 - 01:00      0
             01:00 - 02:00      0
             02:00 - 03:00      12 ... etc

我已经浏览过Stackoverflow,发现这个看似相似的问题

LINK

根据我的理解,我需要创建一个包含24小时插槽的单独表格,然后将其加入到我的查询中以在我的查询中显示IFNULL(COUNT(*),0)结果。

有人可以证明这在实践中如何运作?

更新

使用Strawberry的建议,下面是我现在所拥有的:

SELECT CONCAT(CURDATE(),' 00:00:00') + INTERVAL i2.i*10+i1.i HOUR today
      , COUNT(received) total
   FROM ints i1
  CROSS
   JOIN ints i2   
   LEFT
   JOIN digital_lead
     ON DATE_FORMAT(received,'%Y-%m-%d %h:00:00') = CONCAT(CURDATE(),' 00:00:00') + INTERVAL i2.i*10+i1.i HOUR
  WHERE received BETWEEN '2014-11-01 00:00:00' AND '2014-11-26 00:00:00'
  GROUP
     BY HOUR(received)

然而,这并没有显示任何结果,我知道有一些......?

1 个答案:

答案 0 :(得分:0)

这不一定是我提倡的解决方案,但你要求在这些方面看到一个例子......

我有一个整数表(0-9)。我可以加入一个字符串来制作一个列表,就像这样......

 SELECT CONCAT(CURDATE(),' 00:00:00') + INTERVAL i HOUR today FROM ints;
 +---------------------+
 | today               |
 +---------------------+
 | 2014-11-26 00:00:00 |
 | 2014-11-26 01:00:00 |
 | 2014-11-26 02:00:00 |
 | 2014-11-26 03:00:00 |
 | 2014-11-26 04:00:00 |
 | 2014-11-26 05:00:00 |
 | 2014-11-26 06:00:00 |
 | 2014-11-26 07:00:00 |
 | 2014-11-26 08:00:00 |
 | 2014-11-26 09:00:00 |
 +---------------------+

如果我想在列表中添加10个以上的项目,我可以多次加入整数,就像这样......

 SELECT CONCAT(CURDATE(),' 00:00:00') + INTERVAL i2.i*10+i1.i HOUR today FROM ints i1,ints i2 HAVING DATE(today) = DATE(CURDATE());
 +---------------------+
 | today               |
 +---------------------+
 | 2014-11-26 00:00:00 |
 | 2014-11-26 01:00:00 |
 | 2014-11-26 02:00:00 |
 | 2014-11-26 03:00:00 |
 | 2014-11-26 04:00:00 |
 | 2014-11-26 05:00:00 |
 | 2014-11-26 06:00:00 |
 | 2014-11-26 07:00:00 |
 | 2014-11-26 08:00:00 |
 | 2014-11-26 09:00:00 |
 | 2014-11-26 10:00:00 |
 | 2014-11-26 11:00:00 |
 | 2014-11-26 12:00:00 |
 | 2014-11-26 13:00:00 |
 | 2014-11-26 14:00:00 |
 | 2014-11-26 15:00:00 |
 | 2014-11-26 16:00:00 |
 | 2014-11-26 17:00:00 |
 | 2014-11-26 18:00:00 |
 | 2014-11-26 19:00:00 |
 | 2014-11-26 20:00:00 |
 | 2014-11-26 21:00:00 |
 | 2014-11-26 22:00:00 |
 | 2014-11-26 23:00:00 |
 +---------------------+

如果您不喜欢维护实用程序表的开销(有些人似乎不太奇怪),您还可以使用您在运行中创建的列表(SELECT 0 UNION SELECT 1 UNION SELECT 2等)来替换实用程序表。

现在你只需输入你的源数据,就像这样......

 SELECT * FROM my_table;
 +---------------------+
 | dt                  |
 +---------------------+
 | 2014-11-26 03:15:35 |
 | 2014-11-26 03:17:32 |
 | 2014-11-26 04:19:01 |
 | 2014-11-26 09:44:11 |
 | 2014-11-26 09:54:00 |
 | 2014-11-26 09:59:30 |
 | 2014-11-26 12:07:24 |
 | 2014-11-26 12:07:26 |
 | 2014-11-26 13:01:15 |
 | 2014-11-26 17:00:00 |
 +---------------------+


  SELECT CONCAT(CURDATE(),' 00:00:00') + INTERVAL i2.i*10+i1.i HOUR today
       , COUNT(dt) total
    FROM ints i1
   CROSS
    JOIN ints i2
    LEFT
    JOIN my_table x
      ON DATE(dt) = DATE(CONCAT(CURDATE(),' 00:00:00') + INTERVAL i2.i*10+i1.i HOUR)
     AND HOUR(dt) = HOUR(CONCAT(CURDATE(),' 00:00:00') + INTERVAL i2.i*10+i1.i HOUR)
   WHERE DATE(CONCAT(CURDATE(),' 00:00:00') + INTERVAL i2.i*10+i1.i HOUR) = CURDATE()
   GROUP
      BY CONCAT(CURDATE(),' 00:00:00') + INTERVAL i2.i*10+i1.i HOUR;
 +---------------------+-------+
 | today               | total |
 +---------------------+-------+
 | 2014-11-26 00:00:00 |     0 |
 | 2014-11-26 01:00:00 |     0 |
 | 2014-11-26 02:00:00 |     0 |
 | 2014-11-26 03:00:00 |     2 |
 | 2014-11-26 04:00:00 |     1 |
 | 2014-11-26 05:00:00 |     0 |
 | 2014-11-26 06:00:00 |     0 |
 | 2014-11-26 07:00:00 |     0 |
 | 2014-11-26 08:00:00 |     0 |
 | 2014-11-26 09:00:00 |     3 |
 | 2014-11-26 10:00:00 |     0 |
 | 2014-11-26 11:00:00 |     0 |
 | 2014-11-26 12:00:00 |     2 |
 | 2014-11-26 13:00:00 |     1 |
 | 2014-11-26 14:00:00 |     0 |
 | 2014-11-26 15:00:00 |     0 |
 | 2014-11-26 16:00:00 |     0 |
 | 2014-11-26 17:00:00 |     1 |
 | 2014-11-26 18:00:00 |     0 |
 | 2014-11-26 19:00:00 |     0 |
 | 2014-11-26 20:00:00 |     0 |
 | 2014-11-26 21:00:00 |     0 |
 | 2014-11-26 22:00:00 |     0 |
 | 2014-11-26 23:00:00 |     0 |
 +---------------------+-------+

记住,我说我不一定会提倡这个解决方案; - )