2016-12-22 10 views
2

以下は純粋なSQLクエリです。Yiiフレームワーク2の結合機能でサブクエリを使用する方法ActiveRecord?

SELECT a.*, b.* 
FROM a 
INNER JOIN b 
ON a.id = b.a_id 
INNER JOIN (
    SELECT a_id, MAX(add_time) AS max_add_time 
    FROM b 
    GROUP BY a_id 
) m 
ON b.a_id = m.a_id AND b.add_time = m.max_add_time 
ORDER BY b.add_time DESC 

2番目のサブクエリはINNER JOINです。私のアクティブなクエリの下。

$subQuery = B::find()->select(['a_id', 'MAX(add_time) AS max_add_time'])->groupBy('a_id'); 

$query = A::find()->innerJoin('b', 'a.id = b.a_id') 
        ->innerJoin('(' . 
         $subQuery->prepare(Yii::$app->db->queryBuilder) 
           ->createCommand() 
           ->rawSql 
        . ') m', 'b.a_id = m.a_id AND a.add_time = m.max_add_time ') 
        ->orderBy('b.add_time DESC'); 

それは正常に動作しますが、私は二INNER JOINでサブクエリを使用する方法が好きではありません。私がこのクエリでアプローチしたいのは、右テーブルで左テーブル内部結合を選択し、グループをa_idで、右テーブルのadd_time(DESC)で並べ替えることです。 2番目のINNER JOINでサブクエリをうまく使うべきですか?

答えて

4

以下のスニペットはテストされていませんが、そのようなものでなければなりません。ドキュメント(http://www.yiiframework.com/doc-2.0/yii-db-query.html#innerJoin()-detail)を読むと、サブクエリを持つ配列が有効な入力であり、そのキーが別名であることがわかります。

$subQuery = B::find() 
    ->select(['a_id', 'MAX(add_time) AS max_add_time']) 
    ->groupBy('a_id'); 

$query = A::find() 
    ->innerJoin('b', 'a.id = b.a_id') 
    ->innerJoin(['m' => $subQuery], 'b.a_id = m.a_id AND a.add_time = m.max_add_time') 
    ->orderBy('b.add_time DESC'); 
+0

Thanks a ton bro。私は先月から苦しんでいましたが、ついにこの解決策を得ました。 – Rahul

+0

優れたソリューション、素晴らしい仕事! –

関連する問題