Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CDbCriteria在yii框架中编写子查询_Yii - Fatal编程技术网

使用CDbCriteria在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

您好,我正在使用yii
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);