如何在Yii framework 2 ActiveRecord的join函数中使用子查询?

O C*_*nor 6 sql inner-join subquery yii2

下面是我的纯SQL查询.

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
Run Code Online (Sandbox Code Playgroud)

我在第二个中有子查询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');
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我不喜欢在第二个中使用子查询的方式INNER JOIN.我想用这个查询来处理的是选择左表内连接和右表,分组a_id依次和右表的add_time(DESC).我应该如何在第二个INNER JOIN中更好地使用子查询?

jag*_*ler 9

下面的代码片段未经测试,但它应该是这样的.如果您阅读了文档(在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');
Run Code Online (Sandbox Code Playgroud)