Mysql
 sql >> Database >  >> RDS >> Mysql

SELECT sottoquery con condizione WHERE in Yii2 find() / QueryBuilder

La query di esempio, da una prospettiva SQL, utilizza una "sottoquery correlata" all'interno della clausola select e spesso questo è un modo molto inefficiente per formare una query.

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

Sebbene a prima vista possa sembrare più complesso e quindi meno efficiente, in genere è meglio per le prestazioni evitare "sottoquery correlate" in una clausola select e sostituirla utilizzando una "tabella derivata", come questa:

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

Nota, una sottoquery correlata con una clausola select potrebbe restituire NULL e, per questo motivo, se si sostituiscono con una tabella derivata, il tipo di join equivalente è un LEFT OUTER JOIN (o semplicemente LEFT JOIN) poiché ciò consente anche un risultato NULL. Tuttavia, se non hai bisogno di NULL per la colonna, usa invece il più efficiente INNER JOIN.

Ci scusiamo in anticipo per non conoscere la sintassi di Yii2, ma sembra importante conoscere un approccio alternativo efficace che possa aiutare a risolvere il problema.