MySQL查询:按用户最佳10轮得分总和排序的顶尖玩家列表
顶尖玩家列表的MySQL查询方案
Got it,我来帮你搞定这个顶尖玩家排名的SQL查询!根据你的需求——每个用户取得分最高的10轮分数求和,再按总和降序排序,结合你的表结构(id, idRound, idUser, score,且(idRound, idUser)组合唯一),这里有两种适配不同MySQL版本的方案:
方案一:MySQL 8.0+ (推荐,效率更高)
用窗口函数可以简洁高效地实现需求,代码如下:
SELECT idUser, SUM(top_scores.score) AS total_top_10_score FROM ( SELECT idUser, score, -- 按用户分组,组内分数降序排名 ROW_NUMBER() OVER (PARTITION BY idUser ORDER BY score DESC) AS rank_num FROM your_table_name -- 替换成你的实际表名 ) AS top_scores WHERE rank_num <= 10 -- 筛选每个用户前10高的分数 GROUP BY idUser ORDER BY total_top_10_score DESC;
代码逻辑说明:
- 内层子查询:通过
ROW_NUMBER()窗口函数,给每个用户的所有轮次分数按从高到低的顺序标上排名。比如用户A的最高分对应rank_num=1,次高分对应rank_num=2,以此类推。 - 外层查询:过滤出每个用户排名前10的分数记录,按用户ID分组求和,最后按总分从高到低排序,得到最终的顶尖玩家列表。
方案二:MySQL 5.x (兼容旧版本)
如果你的MySQL版本低于8.0,不支持窗口函数,可以用子查询的方式实现:
SELECT t1.idUser, SUM(t1.score) AS total_top_10_score FROM your_table_name t1 -- 替换成你的实际表名 WHERE 10 > ( -- 统计同用户中比当前记录分数更高的轮次数量 SELECT COUNT(*) FROM your_table_name t2 WHERE t2.idUser = t1.idUser AND t2.score > t1.score ) GROUP BY t1.idUser ORDER BY total_top_10_score DESC;
代码逻辑说明:
- 核心逻辑是:对每条记录,统计同一个用户里分数比它高的轮次数量。如果这个数量小于10,说明这条记录属于该用户得分最高的10轮之一,最后把这些记录分组求和并排序。
内容的提问来源于stack exchange,提问作者user3283649
相关产品推荐
相关产品推荐

