sql >> Databasteknik >  >> RDS >> Mysql

VÄLJ underfråga med WHERE-villkor i Yii2 find() / QueryBuilder

Exempelfrågan, ur ett SQL-perspektiv, använder en "korrelerad underfråga" inuti select-satsen och ofta är detta ett mycket ineffektivt sätt att skapa en fråga.

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

Även om det vid första anblicken kan tyckas vara mer komplext och därmed mindre effektivt, är det generellt sett bättre för prestanda att undvika "korrelerade underfrågor" i en select-sats och ersätta med en "deriverad tabell" istället, så här:

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

Observera att en korrelerad underfråga med en select-sats kan returnera NULL, och på grund av detta, om du ersätter dem med en härledd tabell, är motsvarande jointyp en LEFT OUTER JOIN (eller helt enkelt LEFT JOIN) eftersom detta också tillåter ett NULL-resultat. Men om du inte behöver NULL för kolumnen, använd den effektivare INNER JOIN istället.

Ber om ursäkt på förhand för att jag inte känner till Yii2-syntaxen, men det verkar relevant att känna till ett effektivt alternativt tillvägagångssätt som kan hjälpa till att lösa problemet.



  1. mysqldump gör en partiell backup - ofullständig tabelldump

  2. Hur ditt småföretag kan dra nytta av cloud computing

  3. Hur man inaktiverar en CHECK-begränsning i SQL Server (T-SQL-exempel)

  4. Konfigurationsparameter work_mem i PostgreSQL på Linux