SQL:排序后按列分组

时间:2011-02-25 22:24:26

标签: mysql sql hibernate jpa

鉴于包含namerank列的表结构,可能存在name的重复项,如何通过name获取唯一的行,最大rank

例如,假设以下数据:

+-------+-------+
| 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习惯用法,也会非常感激。

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

这是在示例中返回结果集的最简单的查询。

答案 2 :(得分: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