使用CDbCriteria在yii框架中编写子查询
您好,我正在使用yii使用CDbCriteria在yii框架中编写子查询,yii,Yii,您好,我正在使用yiiCDbCriteria显示我表格的值。我的MySQL查询中有一个子查询。但我不知道如何在yii的$criteria中编写子查询条件。有人能帮忙吗 我的问题是这样的 select * from (select * from Message order by createdOn desc )as mess group by courseid 编辑:表格结构 提前感谢;) 如果您分组,我猜您没有对这些结果使用活动记录?如果没有,您可以只运行查询本身: $sql = "selec
CDbCriteria
显示我表格的值。我的MySQL查询中有一个子查询。但我不知道如何在yii的$criteria
中编写子查询条件。有人能帮忙吗
我的问题是这样的
select * from (select * from Message order by createdOn desc )as mess group by courseid
编辑:表格结构
提前感谢;) 如果您分组,我猜您没有对这些结果使用活动记录?如果没有,您可以只运行查询本身:
$sql = "select * from (select * from Message order by createdOn desc )as mess group by courseid"
$rows = Yii::app()->db->createCommand()->text($sql)->execute();
但正如斯图所说,这是非常低效的,而且很可能有更好的方法
更新
如果确实需要从结果中获取活动记录,则始终可以使用
ActiveRecord::model()->findBySql()
,但对于需要运行的查询类型,您的相似性可能会有所不同,最好使用“createCommand()”。
大概是这样的:
$results = Yii::app()->db->createCommand()
->select('mess.*')
->from('(select * from Message order by createdOn desc) as mess')
->group('mess.courseid')
->queryAll();
var_dump($results);
这篇文章很好地解释了“CDbCriteria”和“createCommand”之间的区别:您可能没有让Yii CDbCriteria在网格中显示表的值,而是让数据提供程序(如CActiveDataProvider)。您可以看到有一个CSqlDataProvider。还可以使用CDbCriteria填充sql的“where”筛选条件,并以编程方式显示表:
我希望这会有所帮助。您应该使用CDbExpression 例如:
$criteria->addBetweenCondition(new CDbExpression('(select nombres
from personas p
inner join clientes c on c.id_persona = p.id_persona
where c.id_cliente = t.id_cliente)' ), $model->clienteInicial, $model->clienteFinal);
没有测试:S,但是,我相信这是有效的!!!
对不起,我的英语糟透了 子选择可能会非常低效,发布您的表结构我相信有更好的方法使用联接来实现相同的结果。
id
int(11)NOT NULL自动递增,courseid
int(11)NOT NULL,senderid
int(11)NOT NULL,recipientid
int(11)默认NULL,message
text NOT NULL,createdOn
timestamp NULL DEFAULT CURRENT\u timestamp,status
tinyint(4)DEFAULT'0',fileName
text,主键(id
))ENGINE=InnoDB AUTO\u INCREMENT=4 DEFAULT CHARSET=latin1so您正在从变量表名中选择什么?我不确定我是否理解你想要实现的目标。此外,您还可以编辑您的问题,而不是在评论中发布,这样可以给您更多的写作空间;)谢谢Paystey,但我正在寻找如何在CDBCriteria中编写它,这将很困难,因为正如名称所示,它是用于构建查询数据库的标准,而不是构建整个命令。它是活动记录的助手,因此不是查询生成器的全部。
// your CDbCriteria object:
$criteria = new CDbCriteria();
$criteria->compare('whatever', $this->whatever);
$sql = Yii::app()->db->createCommand()
->select('*')
->from('(select * from Message order by createdOn desc )as mess')
->group('courseid')
// .. any other additions to the query.
// now adding the conditions from the CDbCriteria
->andWhere($criteria->conditions, $criteria->params);
return new CSqlDataProvider($sql, array(
'keyField' => 'id',
'params' => $sql->params,
// the rest is up to you...
$criteria->addBetweenCondition(new CDbExpression('(select nombres
from personas p
inner join clientes c on c.id_persona = p.id_persona
where c.id_cliente = t.id_cliente)' ), $model->clienteInicial, $model->clienteFinal);