0

usersこのユーザーのスコアも表示できるテーブルがあります。つまり、ユーザーは最高スコアを 1 つだけ持つことができます。私が達成したいのは、すべてのユーザーからの上位 10 のハイスコアと、現在のユーザーの 5 つの前のスコアと次の 5 つのスコアを照会することです。
SQLFiddle http://sqlfiddle.com/#!2/466d0/5
現在、すべてのユーザーを選択し、高いスコアで降順で並べ替え、各ユーザーの行番号を与えるクエリがあるため、スコアでソートされます。そのための作業クエリは次のとおりです。

SELECT u.id, u.score,
        @curRow := @curRow + 1 AS POSITION
FROM    b_users u
JOIN    (SELECT @curRow := 0) r
ORDER BY u.score DESC , u.id ASC

出力は正しい

| ID | SCORE | POSITION |
|----|-------|----------|
|  5 |   500 |        1 |
| 20 |   433 |        2 |
| 14 |   432 |        3 |
| 18 |   350 |        4 |
| 19 |   320 |        5 |
| 16 |   201 |        6 |
| 17 |   150 |        7 |
| 12 |    90 |        8 |
| 23 |    90 |        9 |
| 11 |    70 |       10 |
| 22 |    70 |       11 |
| 10 |    60 |       12 |
|  9 |    50 |       13 |
| 21 |    40 |       14 |
|  4 |    12 |       15 |
|  3 |    10 |       16 |
|  8 |    10 |       17 |
| 13 |    10 |       18 |
| 24 |    10 |       19 |
| 15 |     8 |       20 |
|  1 |     5 |       21 |
|  2 |     3 |       22 |
|  6 |     3 |       23 |
|  7 |     2 |       24 |

繰り返しますが、そのための SQLFiddle はhttp://sqlfiddle.com/#!2/466d0/5
です。たとえば、ID が 8 の場合に上位 10 位のみを出力するように、このクエリを拡張する方法に行き詰まっています。 (位置 17) の場合、12 から 22 までの位置も出力します。

4

1 に答える 1

2

次のように、外側のクエリでラップしてみてください。

SELECT * 
FROM (
  SELECT u.id, u.score,
        @curRow := @curRow + 1 AS POSITION
  FROM    b_users u
  JOIN    (SELECT @curRow := 0) r
  ORDER BY u.score DESC , u.id ASC) origQuery
WHERE origQuery.position <= 10
   OR (origQuery.position >= (17 - 5) AND origQuery.position <= (17 + 5))
于 2013-10-19T23:01:53.857 に答える