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

VÆLG underforespørgsel med WHERE-betingelsen i Yii2 find() / QueryBuilder

Eksempelforespørgslen bruger fra et SQL-perspektiv en "korreleret underforespørgsel" inde i select-klausulen, og ofte er dette en meget ineffektiv måde at danne en forespørgsel på.

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

Selvom det ved første øjekast kan se ud til at være mere komplekst og dermed mindre effektivt, er det generelt bedre for ydeevnen at undgå "korrelerede underforespørgsler" i en select-klausul og erstatte med en "afledt tabel" i stedet, som denne:

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

Bemærk, at en korreleret underforespørgsel med en select-klausul kan returnere NULL, og på grund af dette, hvis de erstattes med en afledt tabel, er den tilsvarende jointype en LEFT OUTER JOIN (eller blot LEFT JOIN), da dette også tillader et NULL-resultat. Men hvis du ikke har brug for NULLs til kolonnen, så brug den mere effektive INNER JOIN i stedet.

Undskyld på forhånd for ikke at kende Yii2-syntaksen, men det virker relevant at kende en effektiv alternativ tilgang, som kan hjælpe med at løse problemet.



  1. Jeg indstiller en MySQL-kolonne til NOT NULL, men jeg kan stadig indsætte en tom værdi

  2. Hvorfor bruge et READ UNCOMMITTED isolationsniveau?

  3. Sådan aktiverer du SSL/TLS til MySQL i Ubuntu

  4. 5 trin til at opbygge en marketingdatabase