1

コードでこれを実行できることはわかっていますが、クエリが一致する結果に加えて、(たとえば) 10 個の結果を選択する直接的な SQL 方法があるかどうかに興味がありました...

たとえば、全員がスコアを持っているプレーヤーのデータベースを持っていて、スコアが自分より低い 5 人のプレーヤーと 5 人が上回っているプレーヤーをユーザーに表示したいとしましょう。またはwhere句で、次のように言います...

select score as selectedScore from player_scores where playerId = xxxx
or (score > selectedScore - 5 and score < selectedScore + 5)

これは、すべてのスコアが正確な順序であることを意味することに気付きました。これらのスコアから userIds を取得するようにクエリを変更するので、これは質問のための疑似例にすぎません。

私はそれがうまくいくと思いますが、これにアプローチする*正しい方法ですか?

4

1 に答える 1

1

を使用して、およびをUNION使用する2つのクエリを組み合わせて、それぞれ次の5つと前の5つを選択できます。各クエリで自己参加を使用することにより、目的のプレーヤーのスコアに隣接する他のすべてのプレーヤーを見つけることができます(ただし、これはで一意であると想定しています)。ORDER BYLIMITplayerIdplayer_scores

(
  SELECT   p1.playerId, p1.score
  FROM     player_scores AS p1 JOIN player_scores AS p2 ON p1.score >= p2.score
  WHERE    p2.playerId = ?
  ORDER BY p1.score ASC
  LIMIT    6
) UNION ALL (
  SELECT   p1.playerId, p1.score
  FROM     player_scores AS p1 JOIN player_scores AS p2 ON p1.score <  p2.score
  WHERE    p2.playerId = ?
  ORDER BY p1.score ASC
  LIMIT    5
)
于 2012-06-05T23:32:24.230 に答える