2016-07-13 16 views
0

Hallo möchte Ich mag diese ähnlichemysql select Unterabfrage in yii2

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

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 

wird lassen, so dass ich eine MySQL-Abfrage machen:

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

und es funktioniert auch in mysql kann ich bekommen was ich will.

aber ich weiß nicht, wie diese

aktiv in yii2 zu schreiben habe ich versucht:

$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(); 

aber es hat nicht funktioniert.

danke.

+0

Es ist nicht sehr klar, was Sie zu erreichen versuchen. Versuchen Sie zuerst, es in Wörtern zu definieren, und erstellen Sie dann die Abfrage dafür. Und das scheint kein YII2-Problem zu sein, sondern nur eine normale mySql-Abfrage. –

+0

Was ist Ihr Primärschlüssel? – Strawberry

+0

@Strawberry Ich denke das ist nicht das Problem. Weil ich mit MySQL-Abfrage arbeiten kann. Ich habe die andere Seriennummer als meinen Primärschlüssel –

Antwort

0

dieses Versuchen

$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(); 

Sie bekommen hier Details: Yii2 guide section for Query->leftJoin

Und ich fand verwandtes Thema hier: SELECT sub-query with WHERE condition in Yii2 find()/QueryBuilder

+0

Danke! Es klappt! –

0

übrigens eine PK auf (id, erstellt) unter der Annahme, eine bessere (dh effiziente) Art und Weise, dass die Abfrage zu schreiben wäre:

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;