$criteria=new CDbCriteria(); $criteria->with = array('reviewCount', 'category10', 'category20', 'category30', 'town'); $criteria->select = 't.id,business,street,postalCode,contactNo,checkinCount,count(tbl_abc.id) as spcount'; $criteria->join = 'left join tbl_abc on t.id=tbl_abc.businessId'; $criteria->group = 't.id'; $criteria->order = 'spcount DESC'; $criteria->condition='spcount>1'; $bizModel = new CActiveDataProvider(Business::model(), array( 'criteria' => $criteria ));
Я получаю эту ошибку:
Column not found: 1054 Unknown column 'spcount' in 'where clause'
Если я опускаю условие, то запрос работает нормально и заказывает бизнес по spcount. Итак, как мне переписать этот запрос таким образом, чтобы получить все предприятия, чья spcount больше 1?
Насколько я знаю, вы не можете ссылаться на псевдонимы в части WHERE
( доказательная ссылка ). Удалите строку условия и добавьте следующее:
$criteria->having = 'COUNT(tbl_abc.id) > 1';
ОБНОВИТЬ
CActiveDataProvider
принимает экземпляр finder , поэтому вам понадобится область модели:
<?php class Business extends CActiveRecord { public function scopes() { return array( 'hasSpcount' => array( 'with' => array('reviewCount', 'category10', 'category20', 'category30', 'town'), 'select' => 't.id,business,street,postalCode,contactNo,checkinCount,count(tbl_abc.id) as spcount', 'join' => 'left join tbl_abc on t.id=tbl_abc.businessId', 'group' => 't.id', 'order' => 'spcount DESC', 'having' => 'COUNT(tbl_abc.id) > 1', ), ); } } // usage $provider = new CActiveDataProvider(Business::model()->hasSpcount());
Надеюсь, это сработает
Возможно, вы можете использовать запрос подвыборки.
Например, в выбранной части объекта критериев:
$criteria->select = 't.id,business,street,postalCode,contactNo,checkinCount,(select count(id) from tbl_abc where t.id=businessId) as spcount';
Или как внутреннее соединение (которое также может содержать условие «where spcount> 1»):
$criteria->join = 'join (select businessId, count(*) as spcount from tbl_abc) abc on t.id=abc.businessId and abc.spcount>1';
В обоих сценариях spcount также доступен в where-clause вашего запроса. Кроме того, «group by t.id» больше не требуется, поскольку spcount теперь является единственным значением для каждой строки основной таблицы («t»).
Надеюсь это поможет