How to implement select from select in 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) это зло.