我在 MYSQL 下遇到了一些麻烦,希望在这里找到一些答案。
我有一些分数表,想查询排名在当前用户附近的用户。例如,如果当前用户排名#85,我想获取排名在 80 到 90 之间的用户。
这是我的分数表的摘录
uuID | game | score |attempt |lastAttempt
id3 |Gravity | 1186 |156 |2016-06-30 23:58:09
id2 |Gravity | 1376 |2 |2015-07-18 22:45:23
id1 |Gravity | 1759 |165 |2016-06-17 18:13:28
id1 |Primality| 242 |1 |2016-04-28 23:20:32
id4 |Primality| 35 |2 |2016-05-02 21:37:07
当然,分数表不保存排名,它是我查询数据库时动态计算的。我有一个用户表,它给了我它的名字(以及一些其他信息,与我的问题无关):
uuID | userName
id1 | Mathew
id2 | Jon
我做了这个查询来排序分数并为每个用户分配一个排名,例如游戏“重力”:
SELECT @rank:=@rank+1 rank,
IF(@score=s.score, @rank2:=@rank2, @rank2:=@rank) rank2,
s.uuID,
Users.userName,
@score:=s.score score,
s.attempt
FROM
Scores s,
(SELECT @rank:=0, @score:=0, @rank2:=1) r,
Users
WHERE
Users.uuID=s.uuID
AND s.game='Gravity'
ORDER BY score DESC, attempt ASC
这是在几个论坛上找到的标准技术:我将一个带有用户定义变量的临时表加入到分数中……然后加入用户表以获得友好名称。请注意,我实际上使用了 2 个“排名”变量,因为我希望相同的分数具有相同的排名(并且尝试次数不同的相同分数具有不同的排名)结果是好的:
rank |rank2 |uuID |userName |score |attempt
1 |1 |id3 |Simon |4910 |368
2 |2 |id5 |youssef |4284 |246
3 |3 |id2 |Anonymous |2688 |97
4 |4 |id7 |Anonymous |2530 |12
5 |5 |id8 |Anogjh |2295 |24
6 |5 |id9 |Nick |2295 | 7
但是,如果我将此查询用作子查询,则结果是完全随机的:
SELECT * FROM (XXX) temp
(XXX 是之前的选择,带有 rank 和 rank2)给了我:
rank |rank2 |uuID |userName |score | attempt
19 |19 | id3 |Simon |4910 |368
28 |28 | id5 |youssef |4284 |246
26 |26 | id2 |Anonymous |2688 |97
32 |32 | id7 |Anonymous |2530 |12
所以结果仍然按分数和尝试顺序显示,但排名不再给出好结果。现在看来,升序遵循 uuID 升序的顺序
请记住,我这样做是因为我的目的是查询排名从 80 到 90 的玩家:
SELECT * FROM (XXX) temp WHERE rank BETWEEN 80 AND 90
有人可以解释一下子查询会发生什么吗?也许有人想用另一种技术得到我的结果?
编辑:我更正了描述中的用户名列,我将准备一个 sqlfiddle