как сделать запрос в запросе

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
romanown
Сообщения: 7
Зарегистрирован: 2015.01.04, 22:19

как сделать запрос в запросе

Сообщение romanown » 2019.11.29, 16:18

Добрый день. есть таблица заказов и таблица товаров в этих заказах. товары в заказе могут быть не все проданы. чтобы посчитать количество проданных товаров и суммировать итоговую стоимость заказов сделал в сторонней программе запрос в котором объединяю эти таблицы и делаю выборку стоимостей с суммированием, группируя по номеру заказа. при этом получаю данные по каждому заказу. а чтобы получить общую картину и распределить суммы по диапазонам, все что придумал это сделать еще один sql запрос из результатов предыдущего, где уже суммирую получившиеся значения и группирую по диапазонам сумм, чтобы понять как много и на какую сумму продано товаров стоимостью от 1 до 10р, от 10 до 100 и так далее. в таком виде все получается. сделал запрос с использованием cdbcriteria и в общем все получилось поле select выглядело как select sum(field) as sumprice from (select (mani, fileds. and, sum) остальное доделывало его до from orders join table on yyy=zzz where anyfield = "any" groupp by order_no) groupp by (case when sum(sumprice) < 10 then 10 else 100 end). и все бы хорошо. но при этом не получается использовать дополнительные переменные условия, например отбор по датам или виду товара, поскольку все condition которые использую приписываются к результирующей, а не внутренней таблице? которой как бы нет получается. использовал просто запрос createCommand и все в таком виде работает, пока не использую те же условия, если я их просто как строку прибавляю в текст запроса, то не срабатывают параметры, оно их не находит. в итоге два вопроса 1 - если я в корне делаю не правильно, как надо в таком случае поступить? 2 - если другого варианта нет или он не лучше, то как сделать запрос в запросе, чтобы при этом критерии приписывались внутреннему запросу. или в крайнем случае как эти все критерии из cdbcriteria превратить просто в строку sql чтобы выполнить простой createCommand?

serg_pro
Сообщения: 1
Зарегистрирован: 2019.12.05, 14:25

Re: как сделать запрос в запросе

Сообщение serg_pro » 2019.12.05, 15:34

romanown писал(а):
2019.11.29, 16:18
все condition которые использую приписываются к результирующей, а не внутренней таблице? которой как бы нет получается. использовал просто запрос createCommand и все в таком виде работает, пока не использую те же условия, если я их просто как строку прибавляю в текст запроса, то не срабатывают параметры, оно их не находит. в итоге два вопроса 1 - если я в корне делаю не правильно, как надо в таком случае поступить? 2 - если другого варианта нет или он не лучше, то как сделать запрос в запросе, чтобы при этом критерии приписывались внутреннему запросу.

Пример,
в модели, в методе который создает CDCriteria , для всяких search методов:

Код: Выделить всё

  $criteria = new CDbCriteria();
        $criteria->alias = 'result_table_alias';
        $criteria->join = '
        RIGHT JOIN
            (SELECT ....  GROUP BY xxx.id) inner_table_alias
        ON inner_table_alias.y_field = result_table_alias.z_field';
Тут же, например для поиска по id (и аналогично по другим полям):

Код: Выделить всё

        if ($this->id) {
            $criteria->addCondition('inner_table_alias.id = :id');
            $params[':id'] = $this->id;
        }
Где-нибудь в конце метода, когда уже все параметры для поиска добавлены:

Код: Выделить всё

$criteria->params = $params;
        $criteria->select = [
            'result_table_name.id ',
            'inner_table_alias.*',
        ];
        return  $criteria;
Чтобы работали сортировки, при создании dataProvider из этой CDbCriteria, нужно явно указать по каким полям делать Order by:

Код: Выделить всё

return new Components\Db\CActiveDataProvider($this, [
	'criteria' => $criteria,
	'sort' => [
                'attributes' => [
                    'period' => [
                        'asc' => 'inner_table_alias.period ASC',
                        'desc' => 'inner_table_alias.period DESC',
........
или в крайнем случае как эти все критерии из cdbcriteria превратить просто в строку sql чтобы выполнить простой createCommand?
Например, если есть CDbCriteria в $countCriteria:

Код: Выделить всё

$countQuery = Yii::app()->db->commandBuilder->
        createFindCommand($this->tableName(), $countCriteria);
$query = Yii::app()->db->commandBuilder->
        createSqlCommand('SELECT COUNT(*) FROM (' . $countQuery->getText() . ' ) alias', $params);

romanown
Сообщения: 7
Зарегистрирован: 2015.01.04, 22:19

Re: как сделать запрос в запросе

Сообщение romanown » 2019.12.15, 12:38

спасибо.

Ответить