0

嗨,我正在使用 yiiCDbCriteria来显示我的表格的值。我的 MySQL 查询中有一个子查询。$criteria但我不知道如何在yii中编写子查询条件。任何人都可以帮助做到这一点

我的查询是这样的

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

4 回答 4

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”之间的区别:在此处输入链接描述

于 2013-07-31T08:05:38.167 回答
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...

我希望这会有所帮助。

于 2014-01-07T02:53:18.150 回答
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,但是,我确信这可行!对不起,我的英语很烂!!

于 2014-06-28T17:21:26.880 回答
0

如果您进行分组,我猜您没有对这些结果使用活动记录?如果没有,您可以只运行查询本身:

$sql = "select * from (select * from Message order by createdOn desc )as mess group by courseid"
$rows = Yii::app()->db->createCommand()->text($sql)->execute();

但正如 Stu 所说,它的效率非常低,并且可能有更好的方法来做到这一点。

更新 如果您确实需要从结果中获取活动记录,那么您可以随时使用ActiveRecord::model()->findBySql(),但您的里程可能会有所不同

于 2012-11-09T16:31:18.440 回答