2016-09-16 67 views
2

我被告知我不能在一个MySQL Query中拥有GROUP BY和ORDER BY。下面是该查询的简化版本 -在一个查询中同时拥有GROUP BY和ORDER BY

SELECT n.colorName, n.colorComp, n.colorID, SUM(n.gallons) AS TotalGallons 
FROM netTran n, Store m, Product p 
WHERE ((n.store = m.store) and m.state = "FL") 
AND ((n.salesNbr = p.salesNbr) AND (p.intExt = "EXTERIOR" OR p.intExt = "INT/EXT")) 
AND ((n.clrnt1 = "L1") AND (n.clrnt1 = "R3")) 
GROUP BY n.colorComp, n.colorID 
ORDER BY TotalGallons DESC; 

有人告诉我一个具有与GROUP BY的ORDER BY会给我不同的结果,并认为只有这样的ORDER BY会的工作是,如果主查询嵌套在

SELECT * FROM 
(query) 
ORDER BY TotalGallons DESC; 

这是正确的吗?

+2

不,这是不正确的。 'ORDER BY'在'GROUP BY'后面工作得很好;它会以不同的顺序给你相同的结果;如果你也有一个限制,你将得到不同结果的唯一方法。事实上,如果你想要一些“总加仑数最多的三种颜色”,你会希望第一个查询也具有“极限3”。 – Uueerdo

回答

2


用作

SELECT n.colorName, n.colorComp, n.colorID, SUM(n.gallons) AS  TotalGallons 
FROM netTran n, Store m, Product p 
WHERE ((n.store = m.store) and m.state = "FL") 
AND ((n.salesNbr = p.salesNbr) AND (p.intExt = "EXTERIOR" OR p.intExt = "INT/EXT")) 
AND ((n.clrnt1 = "L1") AND (n.clrnt1 = "R3")) 
GROUP BY n.colorName, n.colorComp,n.colorID 
ORDER BY TotalGallons DESC; 

您可以通过和秩序在单个查询已grouo由查询。但是,你需要提供在你的情况下,所有列都聚集一列

+0

按顺序为您提供数据的升序或降序。通过聚合该列来分组。希望你有一个想法,否则会明确解释你 –

+0

这更有意义。谢谢。 – BigRedEO

+2

如果您要重写查询,您应该(1)激发原因并(2)使用适当的'join'语法。 –

1

集团通过将改变的结果..排序会为了只是目前的数据..

具有ORDER BY与GROUP BY韩元给你不同的结果

0

是的,的确如此。在mysql reference manual中,您可以读取

如果使用GROUP BY,则根据GROUP BY列对输出行进行排序,就好像您对同一列具有ORDER BY一样。为了避免排序该GROUP BY产生的开销,添加ORDER BY NULL:

我想这意味着ORDER BY根本没有任何作用。

好奇......我一直认为,为了通过工作...

+0

我的猜测是* that * ORDER BY'覆盖了GROUP BY的隐式排序,从而阻止了GROUP BY排序。然而,他们警告说,“GROUP BY”甚至做排序是一个不推荐的行为,不要假定它将在未来版本中出现。 – Uueerdo

0

GROUP BYORDER BY是两回事。这显然是错误的,你不能一起使用它们。

GROUP BY用于告诉DBMS根据哪个组来聚合数据。在你的例子中,你总计gallonscolorCompcolorID

ORDER BY用于告诉DBMS按照您希望显示的数据的顺序。在您的查询中按gallons的总和递减。

在标准SQL中,通常不使用GROUP BY而不使用ORDER BY,因为尽管存在分组,数据也可能无序显示。然而,MySQL决定保证GROUP BY执行ORDER BY。因此,在MySQL中,没有必要在GROUP BY之后使用ORDER BY,只要您不希望的其他顺序如您的示例中所示。这种非标准行为现在已被弃用。在这里看到:

https://dev.mysql.com/doc/refman/5.6/en/group-by-optimization.html

然而,依赖隐式GROUP BY排序已被弃用。

所以,你应该有一个ORDER BY子句,只要你想要数据排序。没有例外。