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中更好地使用子查询?
下面的代码片段未经测试,但它应该是这样的.如果您阅读了文档(在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)