MYSQL查询最好成绩排名

极速小乌龟 2021-11-18 13:39:09

现在有个需求是这样的:用户可以参加多次练习模拟活动,每次模拟练习都会有一个分数和答题时间,现在要取每个用户最好成绩(分数最高,如果分数相同则比较用时最少)进行排名。

现在数据表如下

iduserIdactivityIdscoreuseTime
11127832
21127840
31128033
42127633
52129025
62128820
73128045
83129238
93127622

有人知道这个SQL该怎么写吗?试了几次都没写出来,求SQL高手呀

...全文
304 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
极速小乌龟 2021-11-18
  • 打赏
  • 举报
回复

img

img

外包黑奴 2021-11-18
  • 举报
回复
@极速小乌龟 我意思是同一个userid有分数和用时一样的
外包黑奴 2021-11-18
  • 打赏
  • 举报
回复

select * from (
select userID,useTime,score,
row_number()over(partition by userID order by score desc,useTime asc) req
from test) t where t.req=1;

极速小乌龟 2021-11-18
  • 打赏
  • 举报
回复

已经解决了,谢谢大家
SELECT a.*
FROM test AS a
RIGHT JOIN (SELECT userId,MAX(score) AS max_score FROM test GROUP BY userId) AS b ON a.userId = b.userId AND a.score = b.max_score
ORDER BY a.score DESC, a.useTime ASC;

外包黑奴 2021-11-18
  • 举报
回复
@极速小乌龟 如果分数和时间都相同呢
外包黑奴 2021-11-18
  • 举报
回复
@极速小乌龟 查出来是这样的 id userID activityId score useTime 10 3 12 92 36 11 3 12 92 36 8 3 12 92 38 5 2 12 90 25 3 1 12 80 33
极速小乌龟 2021-11-18
  • 举报
回复
@外包黑奴 我用的mysql试了一下查询出来好像是没问题的
外包黑奴 2021-11-18
  • 打赏
  • 举报
回复

按照你的字面意思就是这样的
select userID,max(score) from test group by userID;

极速小乌龟 2021-11-18
  • 举报
回复
@外包黑奴 你可以再max(score)后面加上useTime字段查一下试试,你会发现时间和分数会错乱
weixin_44217786 2021-11-18
  • 打赏
  • 举报
回复

可以用聚合函数max来取出最大分数和时间嘴短的数据进行排序就可以了

极速小乌龟 2021-11-18
  • 举报
回复
@weixin_44217786 一个人的最大分数不一定是最短时间

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧