获取最高分数和MySQL 5.7中最高分数行中的字段

时间:2017-12-05 09:11:48

标签: mysql sql

| 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和date。

| id | uid | score | date    |
—————————————————————————————
| 4  | bbb | 20    | 2017.7.8|

| 3  | aaa | 15    | 2017.7.7|

Select max(score) as score, id, date, uid from data group by uid order by score desc

我可以使用这个sql在v5.7之前得到我想要的MySQL,但是你知道在MySQL 5.7之后有一个sql_mode ONLY_FULL_GROUP_BY。所以我不能像以前那样得到结果。我看到有一些答案告诉我禁用该模式。但是我想知道是否有任何sql可以做到这一点以及我没有禁用该模式。

3 个答案:

答案 0 :(得分:1)

使用左连接而不使用聚合函数重写相同查询的另一种方法

select a.*
from data a
left join data b on a.uid = b.uid
and a.score < b.score
where b.uid is null

请注意,如果存在具有相同最高分数的行,则可能需要CASE语句,而另一个属性可以决定应该选择哪一行来处理此类情况,则可能会为单个uid返回多行

Demo using MySQL 5.7.12

答案 1 :(得分:0)

我建议您使用

仅为此查询更改此属性
SET sql_mode = 'ONLY_FULL_GROUP_BY';

答案 2 :(得分:0)

您可以使用以下查询禁用该模式:

mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

此外,您的查询只会显示score的最高uid,但不会显示相关的iddate

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