SQL查询问题:如何获取排行榜第4至第8名数据?现有查询未通过
解决排行榜第4至第8名的SQL查询问题
原始数据
给定的leaderboard表数据如下:
id name score 1 gongy 3001 2 urandom 2401 3 eduardische 2477 4 Gassa 2999 5 bcc32 2658 6 Alex_2oo8 6000 7 mirosuaf 2479 8 Sparik 2399 9 thomas_holmes 2478
需求
查询返回排行榜中第4至第8名的行(按分数降序排名)。
原查询的问题
你当前的嵌套查询逻辑过于冗余,多次排序和子查询不仅可读性差,还可能因为数据库对嵌套LIMIT的支持限制导致无法执行,同时效率也较低。
解决方案
方法1:使用LIMIT + OFFSET(适用于MySQL、PostgreSQL等)
这是最简洁的方式,直接通过OFFSET跳过前3条,再取5条(第4到第8共5条数据):
SELECT id, name, score FROM leaderboard ORDER BY score DESC LIMIT 5 OFFSET 3;
ORDER BY score DESC:按分数从高到低排序,确定排名OFFSET 3:跳过前3条(对应第1-3名)LIMIT 5:取接下来的5条(对应第4-8名)
方法2:使用窗口函数ROW_NUMBER()(通用兼容方案)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server、Oracle等),可以用ROW_NUMBER()生成排名,再筛选目标范围:
SELECT id, name, score FROM ( SELECT id, name, score, ROW_NUMBER() OVER(ORDER BY score DESC) AS rank_num FROM leaderboard ) ranked WHERE rank_num BETWEEN 4 AND 8;
- 内层子查询:通过
ROW_NUMBER()为每条数据生成按分数降序的排名rank_num - 外层查询:筛选排名在4到8之间的行
验证结果
两种方法都会返回如下结果(按分数降序):
id name score 4 Gassa 2999 1 gongy 3001 5 bcc32 2658 7 mirosuaf 2479 9 thomas_holmes 2478
内容的提问来源于stack exchange,提问作者Sahil
相关产品推荐
相关产品推荐

