sql >> Base de Datos >  >> RDS >> Mysql

SELECCIONE la subconsulta con la condición DONDE en Yii2 find() / QueryBuilder

La consulta de ejemplo, desde una perspectiva de SQL, utiliza una "subconsulta correlacionada" dentro de la cláusula de selección y, a menudo, esta es una forma muy ineficiente de formar una consulta.

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

Aunque a primera vista puede parecer más complejo y, por lo tanto, menos eficiente, generalmente es mejor para el rendimiento evitar las "subconsultas correlacionadas" en una cláusula de selección y sustituirlas por una "tabla derivada", como esta:

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

Tenga en cuenta que una subconsulta correlacionada con una cláusula de selección puede devolver NULL y, debido a esto, si los reemplaza con una tabla derivada, el tipo de unión equivalente es LEFT OUTER JOIN (o simplemente LEFT JOIN), ya que esto también permite un resultado NULL. Sin embargo, si no necesita valores NULL para la columna, utilice en su lugar el INNER JOIN más eficiente.

Disculpas de antemano por no conocer la sintaxis de Yii2, pero parece relevante conocer un enfoque alternativo efectivo que pueda ayudar a resolver el problema.