您好我使用yii CDbCriteria
来显示我的表格的值。我的MySQL查询中有一个子查询。但我不知道如何在yii的$criteria
中编写子查询条件。任何人都可以帮助这样做
我的查询就像这样
select * from (select * from Message order by createdOn desc )as mess group by courseid
修改: 表格结构
id int(11) NOT NULL AUTO_INCREMENT,
courseid int(11) NOT NULL,
senderid int(11) NOT NULL,
recipientid int(11) DEFAULT NULL,
message text NOT NULL,
createdOn timestamp NULL DEFAULT CURRENT_TIMESTAMP,
status tinyint(4) DEFAULT '0',
fileName text,
PRIMARY KEY (id) )
ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
提前致谢;)
答案 0 :(得分:0)
如果您正在分组,我猜你没有使用活动记录来获得这些结果?如果不是,您可以自己运行查询:
$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()
,但您的milage可能会有所不同
答案 1 :(得分:0)
对于您需要运行的查询类型,最好使用'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'之间的区别:enter link description here
答案 2 :(得分:0)
您可能没有Yii CDbCriteria在网格中显示表的值,而是显示数据提供程序(如CActiveDataProvider)。你可以看到有一个CSqlDataProvider。您还可以使用CDbCriteria填充sql的“where”过滤条件,并以编程方式显示表:
http://www.yiiframework.com/doc/api/1.1/CDbCriteria#condition-detail http://www.yiiframework.com/doc/api/1.1/CDbCriteria#params-detail
// 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...
我希望这有用。
答案 3 :(得分:0)
你应该使用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,但是,我相信这有效! 对不起,我的英文糟透了!