MySQL排行榜:获取指定用户前后各2条带排名记录的方法
MySQL 排行榜中心用户前后记录筛选方案
情况1:已存在带rank列的排行榜表
假设你的排行榜表名为leaderboard,直接通过目标用户的排名范围筛选即可:
SELECT user_id, points, rank FROM leaderboard WHERE rank BETWEEN (SELECT rank - 2 FROM leaderboard WHERE user_id = 11) AND (SELECT rank + 2 FROM leaderboard WHERE user_id = 11) ORDER BY rank ASC;
情况2:无rank列,需实时计算排名
如果原始表(假设名为user_points)没有预计算的rank列,用窗口函数RANK()动态生成排名后再筛选:
WITH ranked_users AS ( SELECT user_id, points, RANK() OVER (ORDER BY points DESC) AS rank FROM user_points ) SELECT user_id, points, rank FROM ranked_users WHERE rank BETWEEN (SELECT rank - 2 FROM ranked_users WHERE user_id = 11) AND (SELECT rank + 2 FROM ranked_users WHERE user_id = 11) ORDER BY rank ASC;
补充说明
- 上述SQL会精准筛选出目标用户(user_id=11)排名前后各2条记录,加上自身共5条结果,完全匹配预期输出。
- 如果存在积分相同的用户,可根据需求替换
RANK()为DENSE_RANK()(相同积分用户排名相同)或ROW_NUMBER()(相同积分按指定规则分配唯一排名)。
内容的提问来源于stack exchange,提问作者Muhammad Talha
相关产品推荐
相关产品推荐

