2011-02-25 60 views
3

考慮到與namerank列的表結構後列編組,與正在那裏進行重複的name的可能性,我怎麼能得到通過name獨特的行,最大rankSQL:排序

例如,假定如下的數據:

+-------+-------+ 
| name | rank | 
+-------+-------+ 
| a  | 1  | 
| a  | 2  | 
| b  | 10 | 
| b  | 20 | 
| c  | 100 | 
| c  | 200 | 
+-------+-------+ 

查詢應返回:

+-------+-------+ 
| a  | 2  | 
| b  | 20 | 
| c  | 200 | 
+-------+-------+ 

我有以下的解決方案,是極其緩慢的,我懷疑是O(N^2 )。

SELECT name, 
     rank 
FROM books temp1 
WHERE rank = (SELECT max(rank) 
         FROM book temp2 
         WHERE temp1.name = temp2.name) 

可以改進嗎?有沒有更好的方法來做到這一點?

我正在使用MySQL,並且這最終必須轉換爲JPA,所以如果有這樣的JPA/Hibernate成語,也將非常感激。

回答

5
select name, max(rank) as MaxRank 
    from books 
    group by name 
+0

衛生署!很簡單,謝謝。 – 2011-02-25 22:33:13

1
SELECT name 
    , MAX(rank) AS rank 
    FROM books 
GROUP BY name 

這是最簡單的查詢返回的結果在您的示例設置。

+1

'name' – vlad 2011-02-25 22:29:27

+0

好,趕上你有一個額外的逗號,vlad。糾正。 – spencer7593 2011-02-25 22:31:06

1

通常所有你需要的是一個標準組由

SELECT name, 
     max(rank) as rank 
FROM books temp1 
GROUP BY name 

但由於它是MySQL的,也有另一種

SELECT name, 
     rank 
FROM (
    SELECT name, rank 
    FROM books 
    ORDER BY name, rank desc) ordered 
GROUP BY name