2016-07-13 2 views
0

Привет я хотел бы, чтобы этотMySQL выберите вложенный запрос в yii2

ID | Forename | Surname | Created 
--------------------------------- 
1 | Tom  | Smith | 2008-01-01 
1 | Tom  | Windsor | 2008-02-01 
2 | Anne  | Thorn | 2008-01-05 
2 | Anne  | Baker | 2008-03-01 
3 | Bill  | Sykes | 2008-01-20 

становится как этот

ID | Forename | Surname | Created 
--------------------------------- 
1 | Tom  | Windsor | 2008-02-01 
2 | Anne  | Baker | 2008-03-01 
3 | Bill  | Sykes | 2008-01-20 

поэтому я сделать запрос MySQL:

SELECT 
    * 
FROM tableA as A 
WHERE created = (
    SELECT 
     MAX(created) 
    FROM tableA GROUP BY id having id=A.id 
); 

и это работает в mysql также я могу получить то, что хочу.

, но я не знаю, как написать это в yii2 активной

Я попытался:

$query = (new \yii\db\Query()) 
         ->select(['A.*']) 
         ->from('tableA AS A') 
         ->where('created = (SELECT MAX(created) from tableA GROUP BY id having id=A.id'); 

$command = $query->createCommand(); 
$data = $command->queryAll(); 

, но это не сработало.

спасибо.

+0

Не совсем понятно, что вы пытаетесь выполнить. Попробуйте сначала определить его в словах, а затем построит для него запрос. И это не похоже на проблему YII2, просто обычный запрос mySql. –

+0

Какой у вас ПЕРВЫЙ КЛЮЧ? – Strawberry

+0

@Strawberry Я думаю, что это не проблема. Потому что я могу работать с запросом mysql. Я получил другой серийный номер в качестве основного ключа –

ответ

0

Попробуйте

$subQuery = (new \yii\db\Query()) 
    ->select(['id', 'max_created' => 'MAX(created)']) 
    ->from('tableA') 
    ->groupBy('id'); 

$query = (new \yii\db\Query()) 
    ->select(['A.*']) 
    ->from('tableA AS A') 
    ->leftJoin(['B' => $subQuery], 'B.id = A.id') 
    ->where('A.created = B.max_created'); 

$command = $query->createCommand(); 
$data = $command->queryAll(); 

Вы можете получить подробности здесь: Yii2 guide section for Query->leftJoin

И я нашел соответствующий раздел здесь: SELECT sub-query with WHERE condition in Yii2 find()/QueryBuilder

+0

Спасибо! оно работает! –

0

Кстати, предполагая ПК на (идентификатор, созданный), лучше (то есть более эффективный) способ, чтобы написать этот запрос будет:

SELECT x.* 
    FROM my_table x 
    JOIN 
    (SELECT id,MAX(created) created FROM my_table GROUP BY id) y 
    ON y.created = x.created 
    AND y.id = x.id; 
Смежные вопросы