sql >> Database >  >> RDS >> Mysql

SELECT subquery met WHERE voorwaarde in Yii2 find() / QueryBuilder

De voorbeeldquery gebruikt vanuit SQL-perspectief een "gecorreleerde subquery" in de select-clausule en vaak is dit een zeer inefficiënte manier om een ​​query te vormen.

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

Hoewel het op het eerste gezicht misschien ingewikkelder en dus minder efficiënt lijkt, is het voor de prestaties over het algemeen beter om "gecorreleerde subquery's" in een select-clausule te vermijden en in plaats daarvan een "afgeleide tabel" te gebruiken, zoals deze:

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

Let op:een gecorreleerde subquery met een select-clausule kan NULL retourneren, en als gevolg hiervan is het equivalente join-type, als ze worden vervangen door een afgeleide tabel, een LEFT OUTER JOIN (of gewoon LEFT JOIN), omdat dit ook een NULL-resultaat toestaat. Als u echter geen NULL's voor de kolom nodig heeft, gebruikt u in plaats daarvan de efficiëntere INNER JOIN.

Bij voorbaat excuses voor het niet kennen van de Yii2-syntaxis, maar het lijkt relevant om een ​​effectieve alternatieve benadering te kennen die kan helpen bij het oplossen van het probleem.



  1. MYSQL:SELECTEER som van veldwaarden en SELECTEER ook unieke waarden?

  2. Is Microsoft Access gemakkelijk te leren?

  3. Hoe Oracle ORDER BY en ROWNUM correct te gebruiken?

  4. SAS JMP verbinden met Salesforce.com