Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何按小时对结果进行分组,包括没有记录的小时_Mysql_Sql_Database - Fatal编程技术网

Mysql 如何按小时对结果进行分组,包括没有记录的小时

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

我有一张包含所有订单的表格,我试图按小时分开订单。 如果没有特定小时的记录,查询将忽略该小时,但我试图实现的是报告该小时的“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) = '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还将第一个查询更新为groupby
dummy.time
而不是
hour(orders.time)
这两个查询之间有什么区别?我注意到两者都使用了
右连接
,但为什么第二次查询速度这么快呢?(我想更好地理解
SQL
)@Nevercom第二次查询在
groupby
之后进行
右连接,因此它最多只能连接24行(每小时1行)。第一个查询在
分组依据
之前进行联接,因此它将联接
订单
表中的每一行。