Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SELECT-Unterabfrage mit WHERE-Bedingung in Yii2 find() / QueryBuilder

Die Beispielabfrage verwendet aus SQL-Perspektive eine "korrelierte Unterabfrage" innerhalb der Auswahlklausel, und oft ist dies eine sehr ineffiziente Art, eine Abfrage zu erstellen.

SELECT ParentTable.*, (SELECT MAX(ChildTable.NumberField) 
                       FROM ChildTable
                       WHERE ChildTable.FK_Id = ParentTable.Id)
FROM ParentTable

Obwohl es auf den ersten Blick komplexer und daher weniger effizient erscheinen mag, ist es im Allgemeinen besser für die Leistung, „korrelierte Unterabfragen“ in einer Auswahlklausel zu vermeiden und stattdessen eine „abgeleitete Tabelle“ wie folgt zu verwenden:

SELECT ParentTable.*,c.MxNum
FROM ParentTable
LEFT JOIN (
           SELECT ChildTable.FK_Id, MAX(ChildTable.NumberField) as MxNum FROM ChildTable
           GROUP BY ChildTable.FK_Id
           ) AS c ON c.FK_Id = ParentTable.Id

Beachten Sie, dass eine korrelierte Unterabfrage mit einer Auswahlklausel möglicherweise NULL zurückgibt. Wenn Sie sie daher durch eine abgeleitete Tabelle ersetzen, ist der entsprechende Join-Typ ein LEFT OUTER JOIN (oder einfach LEFT JOIN), da dies auch ein NULL-Ergebnis zulässt. Wenn Sie jedoch keine NULL-Werte für die Spalte benötigen, verwenden Sie stattdessen den effizienteren INNER JOIN.

Entschuldigen Sie im Voraus, dass Sie die Yii2-Syntax nicht kennen, aber es scheint relevant, einen effektiven alternativen Ansatz zu kennen, der bei der Lösung des Problems helfen kann.