在你之后获得最高分和前3分

时间:2013-10-19 22:52:02

标签: mysql sql subquery

我有一个users表,我也可以在这个用户得分。这意味着用户只能获得一个最高分。我想要实现的是查询所有用户的前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
现在我坚持如何扩展这个查询,以便它只输出前10位置,例如,如果我的ID是8(位置17),那么它也输出从12到22的位置。

1 个答案:

答案 0 :(得分: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))