0

我在 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

4

0 回答 0