2012-06-12 2 views
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 

: 이런 식으로 변수를 사용하여

답변

0

해킹의 무언가이다. 더 많은 테이블을 조인 할 때, MySQL은 나중에 where 절에 의해 필터링 된 행에 대해 @i:[email protected]+1을 평가할 수 있습니다.

이 문제를 해결하려면 순위가 조인 외부에서 계산되는지 확인하십시오. 한 가지 방법은 조인 결과를 임시 테이블에 저장하고 그 테이블의 순위를 계산하는 것입니다.

+0

임시 테이블이 이동하지 않습니다. 15 개 정도의 순위가 있으며 고객에게 지불하는 경우 해당 사용자의 실제 게재 위치가 있습니다. –

+0

순위를 계산할 수있는 다른 방법이 있습니까? –

+0

아무 문제없이 즉시 수천 개의 임시 테이블을 만들 수 있습니다. 사실, MySQL은 여러 가지 이유로 임시 테이블을 사용합니다. 다른 방법이 있지만'@i : = @ i + 1' 트릭과 비교할 때 매우 비쌉니다. – Andomar

관련 문제