2014-09-26 29 views
0

的我有表名订单:代用相关查询

 
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用总和(值)分组的每一个顺序< 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 

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

+3

你的查询是好的(列别名周围的单引号除外)。你的术语是错误的。这不是一个相关的子查询。 – 2014-09-26 11:29:46

+1

请注意,您的子查询会选择日期,但会分组id_o。 MySQL允许这样做 - 但它有点奇怪! – Strawberry 2014-09-26 11:37:34

+0

好吧,所以这是不相关的查询,但多选。有什么办法可以用更简单的东西来替代这个多重选择,例如简单的查询?或者在数据库加载方面可以吗? – user3752452 2014-09-26 21:00:17

回答

1

您的内部查询无效。它由id_o分组,但由date选择。为了解决这个问题,在内部查询分组中添加一个额外的列(假设每个id_o的日期总是相同的)。您可以通过启用sql_modeONLY_FULL_GROUP_BY来启用强大的检查。完整示例SQL fiddle

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 

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

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

什么date(S)将SELECT date, SUM(value) FROM orders GROUP BY id_o返回?它可能是第一个,最后一个,平均,最常见的一个,但更好地明确。任何其他DBMS都不会让您执行此查询。

除此之外,我会重新命名一些列以便更具表现力。 mn,mn_oid_o就是这样的例子。另外value没有任何描述,任何东西都可以是一个值。即使date字段本来可以称为value。查询本身看起来很好(尽管可能缺少索引,但请注意)。

+0

为什么内部选择无效?但它的工作。列id_o在下一个处理中并不重要,它仅在“group by”子句中使用。你为什么用id_o使用多个组,日期?我尝试过,但结果与“group by id_o”相同。有什么办法可以用更简单的东西来替代这个多选?我读了类似的多重选择非常加载数据库服务器。 – user3752452 2014-09-26 20:50:40

+0

我在回答中添加了一个示例,我希望它可以帮助,但如果没有,请告诉我。 – Caramiriel 2014-09-27 15:43:37