php - 在 Yii 中将此查询转换为 CDbCriteria 格式

标签 php mysql yii yii-components

我仍在研究 Yii 1.x.x 中 CDbCriteria 的全部功能 - 我有一个相当复杂的 SQL 查询,我想将其转换为在模型中使用 CDbCriteria 格式的查询(如果这可以用更复杂的查询。

我最初的尝试..

$criteria = new CDbCriteria;
$criteria->select = array(
    't.classroom_id, title',
    'COALESCE(COUNT(DISTINCT r.redeemed_code_id),0) AS totalRewards',
    'COALESCE(COUNT(DISTINCT ocm.user_id),0) AS totalStudents',
    'COALESCE(SUM(r.points),0) AS totalPoints'
 );

任何人都可以使用以下查询建议解决此问题的最佳方法吗?推荐任何建议,谢谢..

SELECT
  t.classroom_id,
  title,
  COALESCE ( r.classRewards, 0 ) AS totalRewards,
  COALESCE ( r.classPoints, 0) AS totalPoints,
  COALESCE ( COUNT(DISTINCT ocm.user_id), 0 ) AS totalStudents
 FROM
  organisation_classrooms t
     LEFT JOIN ( select crc.classroom_id,
                        COUNT( DISTINCT crc.redeemed_code_id ) AS classRewards,
                        SUM( crc.points ) as classPoints
                    from classroom_redeemed_codes crc
                       JOIN organisation_classrooms t
                          ON crc.classroom_id = t.classroom_id 
                          AND t.organisation_id = 37383
                    where crc.inactive = 0
                      AND ( crc.date_redeemed >= 1393286400
                       OR crc.date_redeemed = 0 )
                    group by crc.classroom_id ) r
        ON t.classroom_id = r.classroom_id

     LEFT OUTER JOIN organisation_classrooms_myusers ocm
        ON t.classroom_id = ocm.classroom_id
 WHERE
  t.organisation_id = 37383
 GROUP BY title
 ORDER BY t.classroom_id ASC
 LIMIT 10

最佳答案

它不漂亮,但你要求它:D

$criteria = new CDbCriteria();
$criteria->select = '
  t.classroom_id,
  title,
  COALESCE ( r.classRewards, 0 ) AS totalRewards,
  COALESCE ( r.classPoints, 0) AS totalPoints,
  COALESCE ( COUNT(DISTINCT ocm.user_id), 0 ) AS totalStudents';

$criteria->join = '
    LEFT JOIN ( select crc.classroom_id,
                        COUNT( DISTINCT crc.redeemed_code_id ) AS classRewards,
                        SUM( crc.points ) as classPoints
                    from classroom_redeemed_codes crc
                       JOIN organisation_classrooms t
                          ON crc.classroom_id = t.classroom_id 
                          AND t.organisation_id = 37383
                    where crc.inactive = 0
                      AND ( crc.date_redeemed >= 1393286400
                       OR crc.date_redeemed = 0 )
                    group by crc.classroom_id ) r
        ON t.classroom_id = r.classroom_id

     LEFT OUTER JOIN organisation_classrooms_myusers ocm
        ON t.classroom_id = ocm.classroom_id
';

$criteria->group = 'title';
$criteria->order = 't.classroom_id ASC';
$criteria->limit = 10;
$criteria->addCondition('t.organisation_id = :id');
$criteria->params[':id'] = 37383;

然后:

// I will assume that model class name is OrganisationClassrooms
$models = OrganisationClassrooms::model()->findAll($criteria);

// or use it with a dataprovider
$dataProvider= new CActiveDataProvider('OrganisationClassrooms' , array(
  'criteria' => $criteria,
))

关于php - 在 Yii 中将此查询转换为 CDbCriteria 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27509595/

相关文章:

php - SplFixedArray 的性能真的比数组好吗?

php mb_convert_encoding 函数从 ASCII 到 latin-1 不起作用

javascript - PHP 如何在用户提交表单时更新文本

php - 在 yii2 查询中在哪里设置 SQL_BIG_SELECTS?

php - CModel 对比 CFormModel 对比 CActiveRecord

php - 发送电子邮件时出错 [Symfony mailerBundle]

java - 从另一个类访问数据库连接对象

php - Propel 在使用别名连接表时添加 CROSS JOIN 查询

php - 不带 limit() 传递数据库表的所有值

json - Yii2 RESTful Web服务: JSON Request Format