2017-08-15 6 views
0

私は整数の列scoreと100万ビデオゲームの最高記録のテーブルを持っていると言います。ユーザーが上位50点を求めたら、私はselect * from highscores order by score desc limit 50です。シンプル。しかし、ユーザーが51から100までのスコアを要求するとどうなりますか?私はトップ100を選ぶことができ、その後、データベースに接続する私のプログラムでは、最初の50行を無視します。しかしそれは無駄だろう。 200,000行から200100行までを要求した場合はどうなりますか?非効率性は悪化するだけです。クエリのセクションを取得

答えて

0

あなたは別のクエリの結果を照会することができます - あなたはいつもより多くのサイズの選択を行う必要がありますように見えます:

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

我々はトップ100のスコアを選択して、からそのグループの中から最も低いスコアの50を選択します。


より良い解決策は、スコア欄にインデックスを追加することです。トップにする場合は、 xyのハイスコアを選択すると、行 xy。範囲ごとに行を選択する方法については、 this questionを参照してください。 SQL Serverでは

1

(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 

または同じでゲームを考慮することDENSE_RANK()を使用の範囲を取得するためにROW_NUMBER()を使用することができます同じオーダーのスコア - 下のように

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 

in SQL Server 2012 +

あなたは101からに高得点の行を取得するために(それは一桁と同じスコアでゲームを考慮しません)句を取得OFFSET この例を使用することができます200

SELECT * FROM highscores ORDER BY score Desc OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY; 
関連する問題