2013-02-13 1 views
1

navicat에서 실행할 때 변수를 사용하는 쿼리가 있습니다. 하지만 어떤 이유로 Yii에서 문제가 발생합니다. 이 쿼리는 각 게임 유형에서 10 게임 이름을 선택해야합니다yii 정기적 인 쿼리에 문제가 발생했습니다.

$connection = Yii::app()->db; 
$sql = " 
select s.name, s.type 
from (
     select * 
     ,  (@rn := if(@cur=type, @rn+1, 1)) as rn 
     ,  @cur := type 
     from games 
     join (select @cur := '') i 
     order by 
       type 
     ) s 
where rn <= 10 "; 

$command = $connection->createCommand($sql); 
$results = $command->queryAll(); 

:

은이 코드를 사용합니다. navicat에서 실행할 때 일어나는 일은 사이트에서 시도 할 때 각 게임 유형에 대해 하나의 게임 이름 만 반환합니다. 사람이 왜 그런지 알 수 있습니까? 그것을 고치는 방법? 어쩌면 기준으로 어떻게 운영할까요? 도와주세요.

btw 다른 쿼리가 많은 리소스를 차지하기 때문에이 쿼리 (Andomar에 tnx)를 사용하는 이유가 있습니다.

+0

는 $의 위해서 var_dump 결과는 무엇을 보여 않습니다

SQL에 변경

? – ernie

답변

3

Yii 문제가 아닙니다. 순수 PDO을 사용하면이 sql은 한 행만 반환합니다. 하위 쿼리 결과를 분석하면 @rn 변수에 이전 값이 저장되지 않았지만 @cur 변수가 저장된다는 것을 알게되었습니다. 그래서 @rn 변수를 초기화하기 위해 join을 추가했습니다.

$connection = Yii::app()->db; 
$sql = " 
select s.name, s.type 
from (
     select * 
     ,  (@rn := if(@cur=type, @rn+1, 1)) as rn 
     ,  @cur := type 
     from games 
     join (select @cur := '') i 
     join (select @rn := '') j 
     order by 
       type 
     ) s 
where rn <= 10 "; 

$command = $connection->createCommand($sql); 
$results = $command->queryAll(); 
+0

tnx 그것의 작품이지만, 난 여전히 잘 작동 navicat에서 그것을 실행하면 이해해보십시오. 사용 변수 트릭에 대해 더 많이 배울 수있는 자습서가 있습니까? – Dennis

+0

@Dennis, 공식 docs를 시도하십시오 : [link] (http://dev.mysql.com/doc/refman/5.0/en/user-variables.html). 그것은 "일반적으로 사용자 변수에 값을 지정하고 같은 명령문 내에서 값을 읽으면 안됩니다. 결과를 얻을 수는 있지만 보장 할 수는 없습니다." 저는 이런 종류의 변수를 사용하는 전문가는 아닙니다. 필자의 의견으로는,보다 안전한 방법으로 모든 유형을 먼저 읽은 다음 'union'과 'limit 10'을 사용하여 구문을 작성하십시오. –

관련 문제