Sql 从查询中获取节
假设我有一个包含100万个视频游戏高分的表格,其中有一个整数列Sql 从查询中获取节,sql,Sql,假设我有一个包含100万个视频游戏高分的表格,其中有一个整数列score。当用户询问前50个分数时,我会从highscores order by score desc limit 50中选择*。简单。但是如果用户要求51到100分怎么办?我可以选择前100行,然后在与数据库接口的程序中忽略前50行;但那将是浪费。如果他们要第200000到200100行呢?效率低下只会变得更糟 您可以查询另一个查询的结果-看起来您必须始终选择较大数字的大小: select * from ( select
score
。当用户询问前50个分数时,我会从highscores order by score desc limit 50中选择*。简单。但是如果用户要求51到100分怎么办?我可以选择前100行,然后在与数据库接口的程序中忽略前50行;但那将是浪费。如果他们要第200000到200100行呢?效率低下只会变得更糟 您可以查询另一个查询的结果-看起来您必须始终选择较大数字的大小:
select * from (
select * from highscores order by score desc limit 100
)
order by score asc limit 50
在这里,我们选择前100名的分数,从中,我们从100人中选择50名最低的分数。
更好的解决方案是在分数列中添加一个索引,如果您想要顶部的
x
到y
高分,您只需选择从行x
到行y
的所有内容。请参见sql server(2008+)中的“关于按范围选择行”。
您可以使用行数()获取行的范围
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
或使用<强> DeNeSyRANK()<强>考虑相同顺序相同的游戏,如下图
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
在sql server 2012中+
可以使用偏移获取子句(但是它不会考虑一个分数相同的游戏)
此示例用于获取101到200之间的高分行
SELECT * FROM highscores ORDER BY score Desc OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY;