我正在尝试生成一个按小时返回结果的查询,该查询也显示零结果。
目前,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,发现这个看似相似的问题
根据我的理解,我需要创建一个包含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)
然而,这并没有显示任何结果,我知道有一些......?
答案 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 |
+---------------------+-------+
记住,我说我不一定会提倡这个解决方案; - )