Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sous-requête SELECT avec la condition WHERE dans Yii2 find() / QueryBuilder

L'exemple de requête, d'un point de vue SQL, utilise une "sous-requête corrélée" à l'intérieur de la clause select et c'est souvent une manière très inefficace de former une requête.

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

Bien qu'il puisse sembler à première vue plus complexe et donc moins efficace, il est généralement préférable pour les performances d'éviter les "sous-requêtes corrélées" dans une clause select et de les remplacer par une "table dérivée", comme ceci :

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

Notez qu'une sous-requête corrélée avec une clause select peut renvoyer NULL, et pour cette raison, si elle est remplacée par une table dérivée, le type de jointure équivalent est un LEFT OUTER JOIN (ou simplement LEFT JOIN) car cela permet également un résultat NULL. Cependant, si vous n'avez pas besoin de NULL pour la colonne, utilisez plutôt INNER JOIN, plus efficace.

Toutes mes excuses à l'avance pour ne pas connaître la syntaxe Yii2, mais il semble pertinent de connaître une approche alternative efficace qui pourrait aider à résoudre le problème.