我有一个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的位置。
答案 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))