Mysql 如何按小时对结果进行分组,包括没有记录的小时
我有一张包含所有订单的表格,我试图按小时分开订单。 如果没有特定小时的记录,查询将忽略该小时,但我试图实现的是报告该小时的“0” 我还加入了一个包含所有小时的临时表Mysql 如何按小时对结果进行分组,包括没有记录的小时,mysql,sql,database,Mysql,Sql,Database,我有一张包含所有订单的表格,我试图按小时分开订单。 如果没有特定小时的记录,查询将忽略该小时,但我试图实现的是报告该小时的“0” 我还加入了一个包含所有小时的临时表 SELECT sum(orders.price), hour(orders.time) as hour FROM orders RIGHT JOIN dummy_time as dummy ON hour(orders.time) = dummy.time WHERE state = 1 AND (date(orders.time
SELECT sum(orders.price), hour(orders.time) as hour
FROM orders
RIGHT JOIN dummy_time as dummy
ON hour(orders.time) = dummy.time
WHERE state = 1
AND (date(orders.time) = '2014-06-17' or orders.time is null)
GROUP BY hour
您可以在中查看我的查询。您要找的是什么?当state=1与state=0时,它使用一个案例来说明是显示求和顺序还是显示0。如果没有,请告诉我你想要的结果 要从
dummy\u time
获取所有行,请将您的条件从的WHERE
移动到您的右连接
。另外,从dummy.time中选择小时,以便获得所有小时
SELECT sum(orders.price), hour(orders.time) as hour
FROM orders
RIGHT JOIN dummy_time as dummy
ON hour(orders.time) = dummy.time
WHERE state = 1
AND (date(orders.time) = '2014-06-17' or orders.time is null)
GROUP BY hour
在订单没有记录的情况下,使用COALESCE
获取0
的值
SELECT COALESCE(sum(orders.price),0), dummy.time as hour
FROM orders
RIGHT JOIN dummy_time as dummy
ON hour(orders.time) = dummy.time
AND orders.state = 1
AND orders.time BETWEEN '2014-06-17 00:00:00' AND '2014-06-17 23:59:59'
GROUP BY dummy.time
下面查询的查询计划看起来比上面的查询计划更糟糕,但是因为您报告了连接似乎是缓慢的主要原因,所以值得一试。下面的查询在执行联接之前减少了行集
SELECT
COALESCE(t1.orders_sum,0),
t2.time
FROM
(
SELECT
sum(orders.price) orders_sum,
hour(orders.time) orders_hour
FROM orders
WHERE orders.state = 1
AND orders.time BETWEEN '2014-06-17 00:00:00' AND '2014-06-17 23:59:59'
GROUP BY hour(orders.time)
) t1 RIGHT JOIN dummy_time t2 ON t1.orders_hour = t2.time
此外,请确保表已编制索引
CREATE INDEX test_index1 ON orders (state,time);
CREATE INDEX test_index2 ON dummy_time (time);
因此,如果在1小时内没有任何活动订单,您需要一行:SUM(orders.PRICE)
:0
|小时:1
?实际上,我使用了CASE
,但与使用state=1
过滤结果相比,速度非常慢,所以您需要使用CASE的结果,但使用state的速度是,使用CASE
需要7秒,这真的很长时间。谢谢,它工作了,但仍然很慢,没有JOIN
它需要0.04秒才能完成,但是使用JOIN
需要6秒,还有什么方法可以加快速度吗?@Nevercom查看更新,是否也有可能缓存了不带JOIN的查询?@Nevercom还将第一个查询更新为groupbydummy.time
而不是hour(orders.time)
这两个查询之间有什么区别?我注意到两者都使用了右连接
,但为什么第二次查询速度这么快呢?(我想更好地理解SQL
)@Nevercom第二次查询在groupby
之后进行右连接,因此它最多只能连接24行(每小时1行)。第一个查询在分组依据
之前进行联接,因此它将联接订单
表中的每一行。