как сделать запрос в запросе
как сделать запрос в запросе
Добрый день. есть таблица заказов и таблица товаров в этих заказах. товары в заказе могут быть не все проданы. чтобы посчитать количество проданных товаров и суммировать итоговую стоимость заказов сделал в сторонней программе запрос в котором объединяю эти таблицы и делаю выборку стоимостей с суммированием, группируя по номеру заказа. при этом получаю данные по каждому заказу. а чтобы получить общую картину и распределить суммы по диапазонам, все что придумал это сделать еще один 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?
Re: как сделать запрос в запросе
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';
Код: Выделить всё
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;
Код: Выделить всё
return new Components\Db\CActiveDataProvider($this, [
'criteria' => $criteria,
'sort' => [
'attributes' => [
'period' => [
'asc' => 'inner_table_alias.period ASC',
'desc' => 'inner_table_alias.period DESC',
........
Например, если есть CDbCriteria в $countCriteria:или в крайнем случае как эти все критерии из cdbcriteria превратить просто в строку sql чтобы выполнить простой createCommand?
Код: Выделить всё
$countQuery = Yii::app()->db->commandBuilder->
createFindCommand($this->tableName(), $countCriteria);
$query = Yii::app()->db->commandBuilder->
createSqlCommand('SELECT COUNT(*) FROM (' . $countQuery->getText() . ' ) alias', $params);
Re: как сделать запрос в запросе
спасибо.