替换相关查询

时间:2014-09-26 11:24:38

标签: mysql sql

我有名字命令表:

id  id_o  value  date
 1   1     400   2014-09-30 
 2   1     300   2014-09-30
 3   1     200   2014-09-30 
 4   2     100   2014-09-30  
 5   2     200   2014-09-30
 6   3     50    2014-09-29
 7   3     100   2014-09-29
 8   4     300   2014-09-29
 9   5     600   2014-09-28

我需要选择每个按id_o分组的订单,其中sum(value)< 700,从这个选定的表中,我需要按数据分组的显示数据。 我使用多个选择:

select date, sum(mno) as mn 
from (
   select date,sum(value) as 'mno' 
   from orders 
   group by id_o 
   having sum(value)<700
) table_alias 
group by date

结果是:

date            mn
2014-09-30      300
2014-09-29      450
2014-09-28      600

是否有可能替换或简化此相关查询?

1 个答案:

答案 0 :(得分:1)

您的内部查询无效。它按id_o分组,但按date选择。为了解决这个问题,请在内部查询分组中添加一个额外的列(假设每个id_o的日期始终相同)。您可以启用sql_mode的{​​{1}}来启用强检查功能。 SQL fiddle中的完整示例。

ONLY_FULL_GROUP_BY

MySQL允许这种类型的查询,但这样做并不常见。请考虑以下数据:

id  id_o  value  date
 1   1     400   2014-09-29 
 2   1     300   2014-09-30
 3   1     200   2014-09-30 

SELECT date, SUM(mno) AS mn FROM ( SELECT id_o, date, SUM(value) AS mno FROM orders GROUP BY id_o, date HAVING SUM(value) < 700 ) totalPerOrder GROUP BY date (s)会date返回什么?它可能是第一个,最后一个,平均的,最常见的一个,但更好地说明一点。任何其他DBMS都不允许您执行此查询。

除此之外,我会将一些列重命名为更具表现力。 SELECT date, SUM(value) FROM orders GROUP BY id_omnmn_o就是一个例子。 id_o也没有描述任何东西,任何东西都可以是一个价值。甚至可以将value字段称为date。查询本身似乎很好(尽管如果可能缺少索引,请注意)。