2013-02-13 70 views
1

我有查詢使用變量,當我嘗試運行它在navicat它運作良好。但由於某種原因,我有問題在Yii上運行。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(); 

這個查詢應該從每個遊戲類型選擇10點比賽的名字。當我在navicat上運行它時會發生什麼,當我在網站中嘗試它時,它只會返回每個遊戲類型的一個遊戲名稱。 有人知道它發生的原因嗎?如何解決它?也許如何運行標準?請幫幫我。

btw我使用這個查詢(tnx到Andomar)的原因是因爲其他查詢佔用了大量資源。

+0

什麼是變量$ a的var_dump結果顯示? – ernie 2013-02-14 16:51:35

回答

3

這不是Yii問題。使用純粹的PDO,這個sql只返回一行。 分析子查詢結果,我意識到@rn變量沒有存儲以前的值,但@cur做。所以,我添加了join來初始化變量@rn

更改SQL到:

$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 2013-02-15 08:37:49

+0

@Dennis,試試官方文檔:[鏈接](http://dev.mysql.com/doc/refman/5.0/en/user-variables.html)。它說:「一般來說,你不應該給用戶變量賦值,並在相同的語句中讀取值,你可能會得到你期望的結果,但這不能保證。」我不是這種使用變量的專家。在我看來,它的安全性首先讀取所有類型,然後使用「union」和「limit 10」構建語句。 – 2013-02-15 15:33:31