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
。
我正在使用 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
。