1
게임 순위를 생성하는 동안 다음 코드와 비슷한 쿼리를 작성했습니다 (간결하게하기 위해 많은 열이 남았습니다). 처음에는 횡설수설 한 것처럼 보였다. 그러나 gamenumber가 참조 된 테이블을 변경하면 정확한 결과 (두 번째 쿼리)가 생성됩니다.누군가가이 select 문이 동작하는 이유를 설명 할 수 있습니까
mysql> select @i:[email protected]+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:[email protected]+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)
누구나 설명 할 수있는 이유는 순서가 올바른 순위가 다른 이유는 무엇입니까? 당신은 하나의 테이블에서 선택하면 작업이를 기대할 수
select @i:[email protected]+1 as rank
: 이런 식으로 변수를 사용하여
는
임시 테이블이 이동하지 않습니다. 15 개 정도의 순위가 있으며 고객에게 지불하는 경우 해당 사용자의 실제 게재 위치가 있습니다. –
순위를 계산할 수있는 다른 방법이 있습니까? –
아무 문제없이 즉시 수천 개의 임시 테이블을 만들 수 있습니다. 사실, MySQL은 여러 가지 이유로 임시 테이블을 사용합니다. 다른 방법이 있지만'@i : = @ i + 1' 트릭과 비교할 때 매우 비쌉니다. – Andomar