Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SELECT subconsulta com condição WHERE no Yii2 find() / QueryBuilder


A consulta de exemplo, de uma perspectiva SQL, está usando uma "subconsulta correlacionada" dentro da cláusula select e, muitas vezes, essa é uma maneira muito ineficiente de formar uma consulta.
SELECT ParentTable.*, (SELECT MAX(ChildTable.NumberField) 
                       FROM ChildTable
                       WHERE ChildTable.FK_Id = ParentTable.Id)
FROM ParentTable

Embora possa parecer à primeira vista ser mais complexo e, portanto, menos eficiente, geralmente é melhor para o desempenho evitar "subconsultas correlacionadas" em uma cláusula select e substituir usando uma "tabela derivada", assim:
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

Observe que uma subconsulta correlacionada com uma cláusula select pode retornar NULL e, devido a isso, se substituí-los por uma tabela derivada, o tipo de junção equivalente é um LEFT OUTER JOIN (ou simplesmente LEFT JOIN), pois isso também permite um resultado NULL. No entanto, se você não precisar de NULLs para a coluna, use o INNER JOIN mais eficiente.

Pedimos desculpas antecipadamente por não conhecer a sintaxe do Yii2, mas parece relevante conhecer uma abordagem alternativa eficaz que possa ajudar a resolver o problema.