2016-12-22 7 views
2

Ниже приведен мой чистый SQL-запрос.Как использовать подзапрос в функции соединения Yii framework 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 

У меня есть подзапрос во втором 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) правой таблицы. Как лучше использовать подзапрос во втором 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

Спасибо, тонна брата. Я страдал от прошлого месяца, и, наконец, я получил это решение. – Rahul

+0

Отличное решение, отличная работа! –

 Смежные вопросы

  • Нет связанных вопросов^_^