Is there a way to to something like this
SELECT * FROM (SELECT * FROM 'table_name' WHERE 'some_condition')
using CDbCriteria?
Is there a way to to something like this
SELECT * FROM (SELECT * FROM 'table_name' WHERE 'some_condition')
using CDbCriteria?
Раз форум русский, то отвечать буду по-русски
В случае сложных запросов, содержащих вложенные подзапросы, CDbCriteria вряд ли поможет. Используйте Yii DAO.
а что это за запрос такой ?
Могу предположить, что это очень упрощенный запрос, содержащий подзапросы Поэтому и смысла в нем нет.
Кстати, не знаю на сколько это не правильно или правильно.
Но ведь такого рода запрос можно сделать и через AR & CDbCriteria
Пусть товарищ lockheedman покажет свой запрос, а там уж разберемся, можно или нет Но если там трехэтажные селекты, то лучше всё-таки не мучить CDbCriteria…
Не знаю как товарищ, а вот мой:
SELECT `t`.`id` AS `t0_c0`, `t`.`name` AS `t0_c1`, `t`.`price` AS `t0_c3`, `tree`.`id` AS `t1_c0`, `tree`.`value` AS `t1_c1`, `itemImages`.`id` AS `t3_c0`, `itemImages`.`item_id` AS `t3_c1`, `itemImages`.`filename` AS `t3_c2` FROM `item` `t` LEFT OUTER JOIN `items_trees` `itemsTrees` ON (`itemsTrees`.`item_id`=`t`.`id`) LEFT OUTER JOIN `tree` `tree` ON (`itemsTrees`.`tree_id`=`tree`.`id`) LEFT OUTER JOIN `item_image` `itemImages` ON (`itemImages`.`item_id`=`t`.`id`) WHERE tree.id=23 AND
t.id IN (SELECT t.id FROM `item` `t` LEFT OUTER JOIN `items_trees` `itemsTrees` ON (`itemsTrees`.`item_id`=`t`.`id`) LEFT OUTER JOIN `tree` `tree` ON (`itemsTrees`.`tree_id`=`tree`.`id`) LEFT OUTER JOIN `item_image` `itemImages` ON (`itemImages`.`item_id`=`t`.`id`) WHERE (tree.id=12 or tree.id=<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />)
and t.id IN (SELECT t.id FROM `item` `t` LEFT OUTER JOIN `items_trees` `itemsTrees` ON (`itemsTrees`.`item_id`=`t`.`id`) LEFT OUTER JOIN `tree` `tree` ON (`itemsTrees`.`tree_id`=`tree`.`id`) LEFT OUTER JOIN `item_image` `itemImages` ON (`itemImages`.`item_id`=`t`.`id`) WHERE (tree.id=38))
Первый select формирую через:
public function search()
{
$criteria = new CDbCriteria;
$criteria->select = ['id', 'name', 'price'];
$criteria->with = [
'tree' => [
'select' => ['id', 'value']
],
'itemImages'
];
$criteria->together = true;
if (is_array($this->searchTypes)) {
foreach ($this->searchTypes as $i=>$type) {
$criteria->compare('tree.id', $type, false, $i==0 ? 'AND':'OR');
}
}
if (Tree::model()->tree->roots()->findByPk($this->type)) {
$criteria->compare('tree.root', $this->type);
}
return new CActiveDataProvider($this, array(
'criteria' => $criteria,
'pagination' => array(
'pageSize' => 40,
),
));
public function relations()
{
return array(
'itemImages' => array(self::HAS_MANY, 'ItemImage', 'item_id'),
'itemsColors' => array(self::HAS_MANY, 'ItemsColors', 'item_id'),
'itemsFeatures' => array(self::HAS_MANY, 'ItemsFeatures', 'item_id'),
'features' => array(self::HAS_MANY, 'Features', ['feature_id' => 'id'], 'through' => 'itemsFeatures'),
'itemsMedals' => array(self::HAS_MANY, 'ItemsMedals', 'item_id'),
'itemsTrees' => array(self::HAS_MANY, 'ItemsTrees', 'item_id'),
'tree' => array(self::HAS_MANY, 'Tree', ['tree_id' => 'id'], 'through' => 'itemsTrees'),
'colors' => array(self::HAS_MANY, 'Color', ['color_id' => 'id'], 'through' => 'itemsColors', 'order' => 'sort_id ASC'),
);
}
Как второй и третий IN построить, меняются только tree.id=
Насчет AR и CDbCriteria я сомневаюсь. From не представляю как поменять там, condition идет только после WHERE. Если честно не могу понять зачем такой запрос нужен.
Такой запрос нужен для выбора пересечений в nested set дереве различных категорий. Т.к. у сущности может много узлов, то с этим деревом установлена связь много узловк к много сущностей. Нужно получить сущности у которых есть один из многих узлов одного родителя, и один узел у другого родителя, и один из многих узлов третьего родителя сразу.
Ваш то я знаю зачем, а вот SELECT(SELECT) это зло.