在 MySQL 5.7 中获取最高分数和最高分数行中的字段 [重复]

Posted

技术标签:

【中文标题】在 MySQL 5.7 中获取最高分数和最高分数行中的字段 [重复]【英文标题】:Get max score and the fields in the max score row in MySQL 5.7 [duplicate] 【发布时间】:2018-05-18 21:21:04 【问题描述】:
| 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可以做到这一点以及我没有禁用模式。

【问题讨论】:

如果以下任何答案已经解决/帮助您解决了您的问题,请将其标记为答案和/或为答案投票。 【参考方案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

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

Demo using MySQL 5.7.12

【讨论】:

【参考方案2】:

我建议您使用以下方法仅更改此查询的此属性

SET sql_mode = 'ONLY_FULL_GROUP_BY';

【讨论】:

【参考方案3】:

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

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

此外,您的查询将仅显示 uid 中的最大 score,但与 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

【讨论】:

它是否按预期工作?

以上是关于在 MySQL 5.7 中获取最高分数和最高分数行中的字段 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

从 MySQL 数据库中按最低分数获取行

如何获取Phaser 3以输出最终分数

02:输出最高分数的学生姓名

MySQL按键获取最高值,然后为其添加排名

MySQL 怎么用SQL语句写:按学号列出每个学生所选修课程中最高分的课程名称及其分数

应用UserDefaults储存游戏分数和最高分