从查询中获取部分

时间:2017-08-15 02:24:17

标签: sql

假设我有一个包含100万个视频游戏高分的表格,其中包含整数列score。当用户要求获得前50个分数时,我会select * from highscores order by score desc limit 50。简单。但是,如果用户要求51到100分,该怎么办?我可以选择前100名然后,在我的程序接口数据库中,忽略前50行;但那会很浪费。如果他们要求第200000行到第200100行怎么办?效率低下只会变得更糟。

2 个答案:

答案 0 :(得分:1)

在sql server(2008 +)

您可以使用 row_number()来获取行范围

with topScores as
(
 select *,row_number() over(order by score desc) rowNum  from highscores  
)
select * from topScores where (rowNum between 1 and 100) -- or rowNum between 101 and 200

或使用 Dense_Rank()来考虑与同一订单相同分数的游戏 - 如下所示

with topScores as
(
  select *,dense_rank() over(order by score desc) scoreOrder  from highscores  
)
select * from topScores where (scoreOrder between 1 and 100) -- or scoreOrder between 101 and 200
中的

你可以使用OFFSET Fetch Clause(但它不会考虑与一个订单相同分数的游戏) 此示例将高分行从101到200

SELECT * FROM highscores ORDER BY score Desc OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY;

答案 1 :(得分:0)

您可以查询另一个查询的结果 - 看起来您必须始终选择较大数字的大小:

select * from (
    select * from highscores order by score desc limit 100
)
order by score asc limit 50

在这里,我们选择前100个分数,然后我们从该组中选择50个最低分数。

<小时/> 更好的解决方案是在分数列中添加索引,如果您想要排名前xy个高分,则只需选择行x到行y的所有内容。有关按范围选择行的信息,请参阅this question