如何在MySQL查询中使用FIND_IN_SET实现列求和并生成排名
解决方案
可直接运行的实现语句如下:
SELECT a.id_user, a.total, FIND_IN_SET(a.total, b.sorted_total) AS `rank` FROM ( -- 计算每个用户play类型的总积分 SELECT id_user, SUM(score) AS total FROM result WHERE type = 'play' GROUP BY id_user ) AS a, ( -- 生成按总积分降序排列的逗号分隔字符串 SELECT GROUP_CONCAT(total ORDER BY total DESC) AS sorted_total FROM ( SELECT SUM(score) AS total FROM result WHERE type = 'play' GROUP BY id_user ) AS t ) AS b ORDER BY `rank` ASC;
补充说明
- 上述实现的排名逻辑和原生
RANK()窗口函数完全一致:同分数用户排名相同,后续排名会自动跳空(例如两个用户总积分均为70分,排名均为1,下一个20分的用户排名为3),符合预期需求。 - 如果查询涉及的用户量较大,需要先执行以下语句避免
GROUP_CONCAT结果被默认长度限制截断:
SET SESSION group_concat_max_len = 1000000;
内容的提问来源于stack exchange,提问作者Mujab86
相关产品推荐
相关产品推荐

