| id | uid | score | date |
————————————————————————————————
| 1 | aaa | 10 | 2017.7.7|
| 2 | bbb | 5 | 2017.7.7|
| 3 | aaa | 15 | 2017.7.7|
| 4 | bbb | 20 | 2017.7.8|
我想得到每个人的最大分数,每行都应该包括所有字段,如id和日期。
| id | uid | score | date |
—————————————————————————————
| 4 | bbb | 20 | 2017.7.8|
| 3 | aaa | 15 | 2017.7.7|
按uid顺序按分数描述从数据组中选择最大(分数)作为分数、id、日期、uid
在v5之前,我可以使用这个sql在MySQL中获得我想要的东西。7但是你知道在MySQL5.7之后,有一个sql模式,只有完整的组。所以我不能像以前那样得到结果。我看到有一些答案告诉我禁用该模式。但我想知道是否有任何sql可以做到这一点,以及我不禁用该模式。
另一种通过使用左连接而不使用聚合函数重写相同查询的方法
select a.*
from data a
left join data b on a.uid = b.uid
and a.score < b.score
where b.uid is null
注意,它可能会为单个uid返回多行,如果有具有相同最高分数的行,您可能需要一个CASE语句和另一个属性来决定应选择哪一行来处理这种情况
演示使用MySQL 5.7。12
我建议您仅通过使用更改此查询的此属性
SET sql_mode = 'ONLY_FULL_GROUP_BY';
您可以通过以下查询禁用该模式:
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
此外,您的查询将只显示uid
的最大分数
,但不显示相关的id
和date
。
Select max(score) as score, id, date, uid
from data
where (uid,score) in (select uid,max(score)
from data
group by uid
)
group by uid
order by score desc