как комбинировать запросы yii2 - PullRequest
0 голосов
/ 16 мая 2019

У меня есть запрос с 2 таблицами. Я хочу объединить эти два запроса в один запрос. как дела?

public function actionGroup()
{
    $query1 = (new \yii\db\Query())
                ->select(['lao',new \yii\db\Expression('COUNT(lao)'),'nama_ptgs', new \yii\db\Expression('SUM(outstanding)')])
                ->from('debitur')
                ->groupBy('lao')
                ->all();

    $query2 = (new \yii\db\Query())
                ->select(['lao', new \yii\db\Expression('SUM(tgt_pergeseran)')])
                ->from('resume')
                ->groupBy('lao')
                ->all();

    return $this->render('outstanding', [
        'query1' => $query1,
        'query2' => $query2,
    ]);
}

пример sql

SELECT debitur.lao, debitur.Outstanding, debitur.jumlah, resume.Target FROM ( SELECT lao, SUM(outstanding) as Outstanding, COUNT(lao) as jumlah FROM debitur GROUP BY lao )debitur INNER JOIN ( SELECT lao, SUM(tgt_pergeseran) as Target FROM resume GROUP BY lao ) resume ON debitur.lao = resume.lao

ошибка неопределенный индекс

печать ($ запроса); результат

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

В необработанном вами запросе нет условия where() для основного запроса

 SELECT debitur.lao, debitur.Outstanding, debitur.jumlah, resume.Target 
 FROM 
    (SELECT lao, SUM(outstanding) as Outstanding, COUNT(lao) as jumlah FROM debitur GROUP BY lao) debitur 
 INNER JOIN 
    (SELECT lao, SUM(tgt_pergeseran) as Target FROM resume GROUP BY lao) resume 
 ON  debitur.lao = resume.lao

Если это полный и правильный запрос, который показывает правильные результаты в вдове phpmyadmin, вам нужно использовать подзапрос, как показано ниже

$subQueryFrom = new \yii\db\Query();
$subQueryFrom->select(['lao', new \yii\db\Expression('SUM(outstanding) as Outstanding, COUNT(lao) as jumlah')])
    ->from('debitur')
    ->groupBy('lao');

$subQueryJoin = new \yii\db\Query();
$subQueryJoin->select(['lao', new \yii\db\Expression('SUM(tgt_pergeseran) as Target')])
    ->from('resume')
    ->groupBy('lao');

$query = new \yii\db\Query();

$results = $query->select(['debitur.lao', 'debitur.Outstanding', 'debitur.jumlah', 'resume.Target'])
    ->from(['debitur' => $subQueryFrom])
    ->innerJoin(['resume' => $subQueryJoin], 'debitur.lao = resume.lao')
    ->all();

Теперь вы можете использовать $result в своем представлении, которое содержит записи по вашему запросу.

return $this->render('outstanding', [
        'results' => $results,
]);
0 голосов
/ 16 мая 2019

Чтобы объединить результаты 2 запросов из 2 разных таблиц, вы можете использовать Оператор объединения .Из ссылки есть необходимые условия:

  1. Каждый оператор SELECT в UNION должен иметь одинаковое количество столбцов
  2. Столбцы также должны иметь одинаковые типы данных
  3. Столбцы в каждом операторе SELECT также должны быть в том же порядке

Чтобы это работало для вас, вам нужно изменить свои запросы следующим образом:

$query1 = (new \yii\db\Query())
              ->select(['lao',
                         new \yii\db\Expression('COUNT(lao) as count_column'),
                         'nama_ptgs', 
                         new \yii\db\Expression('SUM(outstanding) as sum_column'),
                         new \yii\db\Expression('NULL as tgt_sum')])
              ->from('debitur')
              ->groupBy('lao');

$query2 = (new \yii\db\Query())
                ->select(['lao',
                           new \yii\db\Expression('NULL as count_column'),
                           new \yii\db\Expression('NULL as nama_ptgs'),
                           new \yii\db\Expression('NULL as sum_column'), 
                           new \yii\db\Expression('SUM(tgt_pergeseran) as tgt_sum'),
                ])->from('resume')
                ->groupBy('lao');

Короче говоря, если ваша первая таблица содержит столбцы a и b, а вторая - столбцы a и c.Тогда вам нужно select(['a','b','NULL as c']) из первого и select(['a','NULL as b','c']) со второго, чтобы вы могли объединить два результата

Тогда объединенный запрос просто:

$combinedQuery = $query1->union($query2);
...