问题描述
select *
from (select * from mytable order by `Group`, age desc, Person) x
group by `Group`
这是有效的,因为在 MysqL 中,您可以 不 聚合非分组列,在这种情况下,MysqL 只返回 第一 行。解决方案是首先对数据进行排序,以便对于每个组,您想要的行是第一位的,然后按您想要的值的列进行分组。
您避免了尝试查找max()
等的复杂子查询,以及当有多个具有相同最大值的行时返回多行的问题(就像其他答案一样)
这是一个 MysqL-only 解决方案。我知道的所有其他数据库都会抛出 sql 语法错误,并显示“非聚合列未列在 group by 子句中”或类似消息。因为这个解决方案使用了 未记录 的行为,更谨慎的人可能希望包含一个测试,以断言如果未来版本的 MysqL 改变了这种行为,它仍然可以工作。
5.7 版更新:
从 5.7 版开始,默认情况下sql-mode
包含该设置ONLY_FULL_GROUP_BY
,因此要进行此操作,您必须 没有 此选项(编辑服务器的选项文件以删除此设置)。
解决方法
您如何获得包含每个分组集的最大值的行?
我在这个问题上看到了一些过于复杂的变体,但都没有一个好的答案。我试图把最简单的例子放在一起:
给定下面这样的表格,包含人员、组和年龄列,您将如何获得每个组中最年长的人?(组内的平局应该给出第一个字母结果)
Person | Group | Age
---
Bob | 1 | 32
Jill | 1 | 34
Shawn| 1 | 42
Jake | 2 | 29
Paul | 2 | 36
Laura| 2 | 39
期望的结果集:
Shawn | 1 | 42
Laura | 2 | 39