使用CDbCriteria在yii框架中编写子查询

时间:2012-11-09 16:11:10

标签: yii

您好我使用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

提前致谢;)

4 个答案:

答案 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,但是,我相信这有效! 对不起,我的英文糟透了!