如何解决Mysql:按小时分组,如果没有数据,则为0
首先,您的查询可以用一种更简单的方式表示为:
SELECT COUNT(*) AS totalCalls, HOUR(`end`) AS `Hour`
FROM callsDataTable c
INNER JOIN products p ON c.company = p.number
AND p.id IN (@_PRODUCTS)
AND YEAR(`end`) = @_YEAR AND MONTH(`end`) = @_MONTH
GROUP BY HOUR(`end`) AS `Hour`
ORDER BY `Hour` ASC
使用@NodisplayName在他们的答案中提出的想法:
CREATE TABLE hours_table (hours INT);
INSERT INTO hours_table VALUES(0), (1), (2),
/* put the missing values here */ (23);
您可以加入包含小时数的表,以获取所需的结果:
SELECT COUNT(*) AS totalCalls, h.hours AS `Hour`
FROM callsDataTable c
INNER JOIN products p ON c.company = p.number
RIGHT JOIN hours_table h ON h.hours = HOUR(c.`end`)
AND p.id IN (@_PRODUCTS)
AND YEAR(`end`) = @_YEAR AND MONTH(`end`) = @_MONTH
GROUP BY h.hours
ORDER BY h.hours ASC
如果运行太慢(我确定运行速度很慢),则应该研究一种使用类似方法的方法,end BETWEEN '2015-01-01 00:00:00' AND
'2015-01-31 23:59:59'
而不是比较YEAR(end)
和MONTH(end)
。
可以这样完成:
SET @start = STR_TO_DATE(CONCAT(@_YEAR, '-', @_MONTH, '-01 00:00:00'), '%Y-%m-%d %H:%i:%s');
SET @end = DATE_SUB(DATE_ADD(@start, INTERVAL 1 MONTH), INTERVAL 1 SECOND);
SELECT ...
...
AND `end` BETWEEN @start AND @end
...
但是这种改变本身并没有帮助。它需要一个现场索引end
来带来所需的速度改进:
ALTER TABLE callsDataTable ADD INDEX(end);
使用HOUR(c.end)
的连接条件是另一个原因运行缓慢。
可以通过将表hours_table
与第一个查询(的简化版本)生成的结果集结合在一起来进行改进:
SELECT IFNULL(totalCalls, 0) AS totalCalls, h.hours AS `Hour`
FROM hours_table h
LEFT JOIN (
SELECT COUNT(*) AS totalCalls, HOUR(`end`) as `Hour`
FROM callsDataTable c
INNER JOIN products p ON c.company = p.number
AND p.id IN (@_PRODUCTS)
AND YEAR(`end`) = @_YEAR AND MONTH(`end`) = @_MONTH
GROUP BY HOUR(`end`) AS `Hour`
) d ON h.hours = d.`Hour`
ORDER BY h.hours ASC
解决方法
我有以下查询:
SELECT count(*) as 'totalCalls',HOUR(`end`) as 'Hour'
FROM callsDataTable
WHERE company IN (
SELECT number
FROM products
WHERE products.id IN (@_PRODUCTS))
AND YEAR(`end`) = @_YEAR AND MONTH(`end`) = @_MONTH
group by HOUR(`end`)
上面的查询仅返回进行呼叫的时间:
totalCalls Hour
2 0
1 2
4 7
98 8
325 9
629 10
824 13
665 15
678 16
665 17
606 18
89 22
5 23
期望的输出应该是所有小时,并且在没有呼叫的情况下,该小时应该是0个呼叫,如下所示:
totalCalls Hour
0 0
0 1
1 2
0 3
0 4
0 5
0 6
4 7
98 8
325 9
629 10
0 11
0 12
824 13
0 14
665 15
678 16
665 17
606 18
0 19
0 20
0 21
89 22
5 23
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。