MySQL 8以下版本基于分数总和计算跳跃式排名实现问询
你现有代码实现的是稠密排名(即并列后排名连续不跳跃),要实现你需要的跳跃排名效果,调整用户变量逻辑即可,修改后的查询语句如下:
SELECT id, total, name, CASE WHEN @l = total THEN @r ELSE @r := @count + 1 END AS rank, @l := total, @count := @count + 1 FROM ( SELECT id, name, SUM(score) AS total FROM quiz_users GROUP BY mobile ORDER BY total DESC ) totals, (SELECT @r := 0, @l := NULL, @count := 0) vars
实现逻辑说明
- 新增
@count变量累计已处理的总行数,每处理一行自动+1 - 当遇到和上一条记录分数不同的条目时,直接将排名赋值为当前累计行数+1,自动跳过并列占用的排名位数:例如3条并列第3的记录处理完成后,
@count已经累计为5,下一条分数不同的记录排名就会被设置为5+1=6,完全匹配你需要的输出 - 分数相同的条目保持排名不变,和原有逻辑一致
注意:MySQL低版本中用户变量的赋值按SELECT后字段的书写顺序执行,请保持排名判断逻辑在变量赋值之前,避免出现计算错误。
内容的提问来源于stack exchange,提问作者Razi Momin
相关产品推荐
相关产品推荐

