所以我有这个游戏数据库,我有几个用户有字段,id,名称,点
我需要一个特定用户的排名表,其位置可以看到与点数相关,表中有8个位置的空间,所以我正在寻找一种方法来执行以下操作:
如果我SELECT * FROM users WHERE id = {user_id} ORDER By points
选择之前的4个结果和此ID之后的3个结果。有这样的查询吗?结果应该如下:
---------------------
|id |name |points|
---------------------
| 52 |name1 | 10 |
---------------------
| 23 |name1 | 09 |
---------------------
| 93 |name1 | 08 |
---------------------
| 12 |name1 | 07 |
---------------------
| 43 |queried_name1 | 06 |
---------------------
| 67 |name1 | 05 |
---------------------
| 32 |name1 | 04 |
---------------------
| 91 |name1 | 03 |
---------------------
我试图通过软件来实现这一点但是通过所有结果迭代它是相当慢的。谢谢你的帮助!
答案 0 :(得分:1)
就像上面的结果一样,我会这样说:
SELECT * FROM users WHERE points > (SELECT points FROM users WHERE id = {user_id}) ORDER By points ASC LIMIT 3;
以下结果:
SELECT * FROM users WHERE points < (SELECT points FROM users WHERE id = {user_id}) ORDER By points DESC LIMIT 4;
所以,通过一个大联盟,它会给出:
SELECT * FROM (SELECT * FROM users WHERE points > (SELECT points FROM users WHERE id = {user_id}) ORDER By points ASC LIMIT 3 ) a
UNION
SELECT * FROM users WHERE id = {user_id}
UNION
SELECT * FROM ( SELECT * FROM users WHERE points < (SELECT points FROM users WHERE id = {user_id}) ORDER By points DESC LIMIT 4 ) b
答案 1 :(得分:1)
您可以使用此查询 -
SELECT id, name, points FROM (
SELECT u.*, @r:=@r+1 rank, @pos:=IF(@pos = 0 AND name = 'queried_name1', @r, @pos)
FROM users u,
(SELECT @r:=0, @pos:=0) t
ORDER BY points DESC
) t
WHERE rank BETWEEN @pos - 4 AND @pos + 3
它按点对表进行排名,找到name ='queried_name1'的记录,并在找到的记录之前和之后选择一些行。