Mysql 我在常规查询中遇到了麻烦
我有一个使用变量的查询,当我尝试在navicat上运行它时,它运行得很好。但出于某种原因,我在Yii上运行它 我使用以下代码:Mysql 我在常规查询中遇到了麻烦,mysql,yii,Mysql,Yii,我有一个使用变量的查询,当我尝试在navicat上运行它时,它运行得很好。但出于某种原因,我在Yii上运行它 我使用以下代码: $connection = Yii::app()->db; $sql = " select s.name, s.type from ( select * , (@rn := if(@cur=type, @rn+1, 1)) as rn , @cur := type f
$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上运行它时会发生这种情况,当我在网站上尝试它时,它只会为每种游戏类型返回一个游戏名。
有人知道为什么会这样吗?如何修复它?也许用标准来运行它?请帮帮我
顺便说一句,我之所以使用tnx查询Andomar,是因为其他查询占用了大量资源。这不是Yii问题。使用纯PDO,此sql只返回一行。
通过分析子查询结果,我意识到@rn变量没有存储前面的值,但是@cur存储了。因此,我添加了join来初始化@rn变量
将SQL更改为:
一个$results的var_转储显示了什么?tnx它是有效的,但我仍然试图理解为什么在navicat上运行它时效果很好。你有教程,我可以在那里学到更多关于使用变量的技巧?@Dennis,试试官方文档:。它说:作为一般规则,您永远不应该给用户变量赋值,而应该在同一条语句中读取值。你可能会得到你期望的结果,但这并不是保证。。我不是这种使用变量的专家。在我看来,先阅读所有类型,然后使用union和limit 10构建语句更安全。
$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();