2013-02-13 44 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