You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:35:20