有人可以解释为什么这个select语句的行为方式

时间:2012-06-12 09:06:23

标签: sql mysql4

在为游戏制作排名的同时,我写了一个类似于以下代码的查询(为了简洁省略了很多专栏),并注意到排名产生了看似乱码(第一个查询)。但是,更改引用游戏编号的表会产生正确的结果(第二个查询)。

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)

任何人都可以向我解释为什么在订单正确时排名会有不同的结果?

1 个答案:

答案 0 :(得分:0)

以这种方式使用变量是一种破解:

select @i:=@i+1 as rank

如果您只从一个表中进行选择,则可以预期这个工作。当您将更多表连接在一起时,MySQL可能会评估@i:=@i+1后来被where子句过滤掉的行。

要解决此问题,请确保在联接之外计算排名。一种方法是将连接结果存储在临时表中,并计算其上的排名。