sql >> Databáze >  >> RDS >> Mysql

Dílčí dotaz SELECT s podmínkou WHERE v Yii2 find() / QueryBuilder

Příklad dotazu z pohledu SQL používá "korelovaný poddotaz" uvnitř klauzule select a často je to velmi neefektivní způsob vytváření dotazu.

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

Přestože se na první pohled může zdát, že je složitější a tudíž méně efektivní, pro výkon je obecně lepší vyhnout se „korelovaným poddotazům“ ve klauzuli select a místo toho nahradit „odvozenou tabulkou“, jako je tato:

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

Všimněte si, že korelovaný poddotaz s klauzulí select může vrátit hodnotu NULL a díky tomu, pokud je nahradíte odvozenou tabulkou, je ekvivalentním typem spojení LEFT OUTER JOIN (nebo jednoduše LEFT JOIN), protože to také umožňuje výsledek NULL. Pokud však pro sloupec nepotřebujete hodnoty NULL, použijte místo toho efektivnější INNER JOIN.

Předem se omlouváme, že neznáte syntaxi Yii2, ale zdá se důležité znát účinný alternativní přístup, který může pomoci při řešení problému.



  1. Vidlit či nevidlit?

  2. Porovnejte data uložená jako řetězec pomocí Datetime

  3. SQL SELECT MIN

  4. Práce s databázovými stroji MySQL