【问题标题】:how to combine queries yii2yii2如何组合查询
【发布时间】:2019-05-16 04:18:00
【问题描述】:

我有 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

错误undefined index

打印($查询); result

【问题讨论】:

  • 你想达到什么结果?原始 SQL 中的最终查询应该是什么样子?
  • 提供您的原始 SQL 查询,以便我们了解您想要实现的目标。
  • 原始 SQL 中的最后一个。更新了我的帖子@Yerke
  • 我的原始 SQL 查询我将它添加到我的帖子 @MuhammadOmerAslam
  • 这是一个完整的查询,在主查询中没有任何where() 条件吗?

标签: activerecord yii yii2 yii2-advanced-app


【解决方案1】:

您提供的原始查询没有任何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,
]);

【讨论】:

  • @UcupRahmat 你应该使用lao 作为索引而不是debitur.lao
  • @UcupRahmat 您应该将$team['deitur.lao'] 更改为$team['lao']
  • 仍然错误未定义索引:lao,先生@MuhammadOmerAslam
  • @UcupRahmat 你可以在$query 返回的结果集上使用print_r() 并将数组添加到你的问题中
  • @UcupRahmat 不是您打印查询的结果查询检索到的结果集。
【解决方案2】:

要合并来自 2 个不同表的 2 个查询的结果,您可以使用 Union Operator。但是,从链接中有必要条件:

  1. UNION 中的每个 SELECT 语句必须具有相同数量的 列
  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);

【讨论】:

  • 对不起,我收到错误消息“调用数组上的成员函数 union()”。我在我的帖子中添加了一个 sql 查询。谢谢
  • 你能把你使用的代码发给这里吗:) 我的意思是你遇到这个错误时使用的代码
  • 是的,有一个错误,因为我无法测试这段代码 :) 我现在编辑了。错误是因为在两个查询中使用了 all(),这意味着在联合之前检索结果。联合是在查询上完成的。无论如何,请立即尝试并更新我的进展情况:)
猜你喜欢
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多