MySQL: 在"group by"中使用"order by"

13
我有一个MySQL表格(names),它由两个字段(name和rank)组成。name的值不唯一,可能有多个匹配项。
问题:我想选择记录,并按name分组,但如果有多个name,则应取最高rank的那个。
例如:
Tom 2
Ben 1
Ben 2
通常返回:
Tom 2
Ben 1
我需要:
Tom 2
Ben 2
因为有两个Bens,但第二个Ben排名更高。
看起来,MySQL分组只采用第一个名称并忽略其他名称。
如何对“group by”内的记录进行排序,以便可以指定在具有相同name的多个记录中采用哪个记录?
3个回答

10
你需要一个被称作max的聚合函数:

聚合函数是指对一组值进行计算并返回单个值的函数:

select name, max(rank)
  from names
 group by name;

这样,您将检索到所有不同的名称,每个名称都与其最大排名相关联。

你仍然需要使用 group by name,以便返回每个 namemax(rank),而不是整体的 max(rank) - Dennis Benzinger
@Dennis:是的,已经添加了那部分内容。在赶着发布问题成为第一个时忘记了。 :-) - Pablo Santa Cruz
4
这将给出每个名称均具有最大排名的行,你只想要具有最大排名的名称? - CMCDragonkai

7

对我而言,这个已经奏效:

获取组内的最后一行:

select * from 
( select name, rank from names order by rank desc ) as a 
group by name

语法不正确(不能使用select *,而应该使用group by name - Grisha Weintraub
3
如果你尝试过,就会知道它是有效的。不仅在这个例子上,在最大行中你也可以获取所有信息。 - Roger Russel
1
+1 你说得对,我不知道mysql支持这样的语法。MSSQLOracle不支持... - Grisha Weintraub

3
使用max()函数:
select name,
       max(rank)
from names
group by name
order by max(rank) desc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接