2016-09-16 87 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子句,只要你想要數據排序。沒有例外。