2012-09-23 32 views
3

我有這樣的SQL:如何在使用GROUP BY時執行ORDER BY?

SELECT itemId, parentId, value FROM item ORDER BY value DESC 

其正確返回:

+--------+------------------+ 
| itemId | parentId | value | 
+--------+------------------+ 
|  1 |  5 | 500 | 
|  4 |  1 | 500 | 
|  2 |  5 | 10 | 
|  5 |  1 | 10 | 
|  3 |  5 |  0 | 
|  6 |  1 |  0 | 
+--------+----------+-------+ 

我嘗試添加 「GROUP BY的parentId」,但這似乎挑兩個隨機項目,忽略了ORDER BY子句:

+--------+------------------+ 
| itemId | parentId | value | 
+--------+------------------+ 
|  2 |  5 | 10 | 
|  6 |  1 |  0 | 
+--------+----------+-------+ 

我應該使用什麼SQL來爲每個parentId的?:

最高值僅返回項目
+--------+------------------+ 
| itemId | parentId | value | 
+--------+------------------+ 
|  1 |  5 | 500 | 
|  4 |  1 | 500 | 
+--------+----------+-------+ 
+0

選擇的itemId,parentId的,最大(值)VAL從項目組由parentId的順序由VAL遞減 – Reddy

+0

這會給我結果如[itemId = 2,parentId = 5,value = 10,val = 500]。我需要返回與最高值相關的正確itemId,而不僅僅是最高值本身。 –

回答

1

對於每個itemId,只能選擇它,如果它的value是其parentIdMAX

SELECT itemId, parentId, value 
FROM item i 
WHERE value = (SELECT MAX(value) 
       FROM item t 
       WHERE t.parentId = i.parentId) 

將返回:

| ITEMID | PARENTID | VALUE | 
----------------------------- 
|  1 |  5 | 500 | 
|  4 |  1 | 500 | 

DEMO

+0

是的這有效!我必須爲兩個itemId具有相同的parentId和值(我只需要一個)的情況添加GROUP BY,並且ORDER BY保持無論parentId爲多少,都能獲得最大值。 –

1

我相信這個問題已經在類似的問題之前已經回答:

How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?

+0

你說得對,雖然在我以前的搜索中沒有找到。那裏的解決方案使用INNER JOIN來代替 - 我想知道這是否比在WHERE子句中放置子SELECT更高效? –

+0

我不知道哪一個更有效,而不需要對它們進行測試。通過對「內連接與子查詢」進行一些快速搜索,顯然內連接更高效。 – David