1

ゲームのランキングの生成に取り組んでいるときに、次のコードのようなクエリを作成しました (簡潔にするために多くの列が省略されています)。ランクが意味不明に見えることに気付きました (最初のクエリ)。ただし、gamenumber が参照されたテーブルを変更すると、正しい結果が生成されます (2 番目のクエリ)。

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)

順序が正しいのに、異なる結果がランク付けされる理由を誰かに説明できますか?

4

1 に答える 1

0

このように変数を使用するのはハックのようなものです:

select @i:=@i+1 as rank

1 つのテーブルのみから選択する場合、これが機能することが期待できます。より多くのテーブルを一緒に結合すると、MySQLは後で句@i:=@i+1によって除外される行を評価する場合があります。where

これを解決するには、ランクが結合の外で計算されるようにします。1 つの方法は、結合結果を一時テーブルに格納し、その上でランクを計算することです。

于 2012-06-12T09:10:50.370 に答える