return 每组的最大值,但当出现平局时,return 中 ID 较低的一组在 MySQL

return max value for each group but when there is a tie, return one with lower id in MySQL

我正在使用 MySQL 8.0

我的 table 看起来像这样:

group   user_id    score
  A        1        33
  B        2        22
  A        3        22
  B        4        22

我想要 return

group   user_id score
  A        1     33
  B        2     22

请注意,即使 B 组得分相同,user_id=2 是最终获胜者,因为 he/she 得分较低 user_id

如何改进以下查询...?

SELECT group, user_id, max(score)
  from table

提前致谢!

@Ambleu 你在使用 MAX() 的正确轨道上,但是要做到这一点你需要在 MIN() 之外使用它,并且还使用子查询来获取 MAX(score) 像这样:

SELECT `mt`.`group`,
    MIN(`mt`.`user_id`) AS `user_id`,
    `mt`.`score`
FROM `myTable` AS `mt`
JOIN (SELECT `group`,
        MAX(`score`) AS `score`
      FROM `myTable`
      GROUP BY `group`) AS `der` ON `der`.`group` = `mt`.`group`
        AND `der`.`score` = `mt`.`score`
GROUP BY `mt`.`group`, `mt`.`score`

Here are your tables and the solution query mocked up on db-fiddle.

如果这不能满足您的需求,请告诉我,我会尽力提供进一步的帮助。

在 MySQL 8.0 中,我会推荐 window 函数:

select grp, user_id, score
fom (
    select t.*, 
        row_number() over(partition by grp order by score desc, user_id) rn
    from mytable t
) t
where rn = 1

或者,您可以使用相关子查询进行过滤:

select t.*
from mytable t
where user_id = (
    select t1.user_id
    from mytable t1
    where t1.grp = t.grp
    order by t1.score desc, t1.user_id limit 1
)

第二个查询将利用 (grp, score desc, user_id).

上的索引

旁注:group 是语言关键字,因此列名的选择不佳。我在查询中将其重命名为 grp