2 回答
TA贡献1765条经验 获得超5个赞
在MySQL中有一种非常简单的方法可以做到这一点:
select * from (select * from mytable order by `Group`, age desc, Person) xgroup by `Group`
这是因为在MySQL中你可以不聚合非组按列,在这种情况下,MySQL只返回第一划(船)。解决方案是首先对数据进行排序,这样,对于每个组,您想要的行首先是第一个,然后按您想要的值的列进行分组。
避免复杂的子查询,这些子查询试图查找max()
等等,以及当有多个具有相同最大值的行时(与其他答案相同)时返回多行的问题。
注:这是一个只使用MySQL解决办法。我知道的所有其他数据库都会抛出一个SQL语法错误,消息是“非聚合列不在GROUP BY子句中列出”或类似的。因为此解决方案使用无证行为时,越谨慎的人可能会想要包含一个测试来断言它。遗骸MySQL的未来版本应该会改变这种行为。
5.7版本更新:
自5.7版起,sql-mode
设置包括ONLY_FULL_GROUP_BY
默认情况下,因此要使此工作,必须不有此选项(编辑服务器的选项文件以删除此设置)。
TA贡献1831条经验 获得超4个赞
SELECT o.*FROM `Persons` o # 'o' from 'oldest person in group' LEFT JOIN `Persons` b # 'b' from 'bigger age' ON o.Group = b.Group AND o.Age < b.AgeWHERE b.Age is NULL # bigger age not found
它是如何运作的:
o
b
Group
Age
o
Age
b
.
LEFT JOIN
NULL
b
INNER JOIN
WHERE
NULL
b
进一步读数
TA贡献1839条经验 获得超15个赞
MAX(Group)
Age
SELECT t1.*FROM yourTable t1INNER JOIN( SELECT `Group`, MAX(Age) AS max_age FROM yourTable GROUP BY `Group`) t2 ON t1.`Group` = t2.`Group` AND t1.Age = t2.max_age;
添加回答
举报