在为游戏制作排名的同时,我写了一个类似于以下代码的查询(为了简洁省略了很多专栏),并注意到排名产生了看似乱码(第一个查询)。但是,更改引用游戏编号的表会产生正确的结果(第二个查询)。
mysql> select @i:=@i+1 as rank, a.usernum, s.buildings from account_data as a, statistics as s join (select @i:=0) rank
where a.gamenumber=144 and a.usernum=s.usernum order by s.buildings desc limit 10;
+------+---------+-----------+
| rank | usernum | buildings |
+------+---------+-----------+
| 49 | 31071 | 87557 |
| 45 | 31047 | 86858 |
| 24 | 31064 | 84753 |
| 69 | 31089 | 79682 |
| 17 | 31103 | 76892 |
| 38 | 31106 | 66186 |
| 29 | 31053 | 65069 |
| 47 | 31081 | 59093 |
| 61 | 31036 | 58056 |
| 100 | 31061 | 56833 |
+------+---------+-----------+
10 rows in set (0.01 sec)
mysql> select @i:=@i+1 as rank, a.usernum, s.buildings from account_data as a, statistics as s join (select @i:=0) rank
where s.gamenumber=144 and a.usernum=s.usernum order by s.buildings desc limit 10;
+------+---------+-----------+
| rank | usernum | buildings |
+------+---------+-----------+
| 1 | 31071 | 87557 |
| 2 | 31047 | 86858 |
| 3 | 31064 | 84753 |
| 4 | 31089 | 79682 |
| 5 | 31103 | 76892 |
| 6 | 31106 | 66186 |
| 7 | 31053 | 65069 |
| 8 | 31081 | 59093 |
| 9 | 31036 | 58056 |
| 10 | 31061 | 56833 |
+------+---------+-----------+
10 rows in set (0.00 sec)
任何人都可以向我解释为什么在订单正确时排名会有不同的结果?
答案 0 :(得分:0)
以这种方式使用变量是一种破解:
select @i:=@i+1 as rank
如果您只从一个表中进行选择,则可以预期这个工作。当您将更多表连接在一起时,MySQL可能会评估@i:=@i+1
后来被where
子句过滤掉的行。
要解决此问题,请确保在联接之外计算排名。一种方法是将连接结果存储在临时表中,并计算其上的排名。