Przykładowe zapytanie, z perspektywy SQL, używa „skorelowanego podzapytania” wewnątrz klauzuli select i często jest to bardzo nieefektywny sposób tworzenia zapytania.
SELECT ParentTable.*, (SELECT MAX(ChildTable.NumberField)
FROM ChildTable
WHERE ChildTable.FK_Id = ParentTable.Id)
FROM ParentTable
Chociaż na pierwszy rzut oka może się wydawać, że jest bardziej złożona, a przez to mniej wydajna, ogólnie lepiej jest unikać „skorelowanych podzapytań” w klauzuli select i zastąpić ją „tablicą pochodną” w następujący sposób:
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
Zauważ, że skorelowane podzapytanie z klauzulą SELECT może zwrócić NULL i z tego powodu, jeśli zastąpisz je tabelą pochodną, równoważnym typem złączenia jest LEFT OUTER JOIN (lub po prostu LEFT JOIN), ponieważ pozwala to również na wynik NULL. Jeśli jednak nie potrzebujesz wartości NULL dla kolumny, użyj zamiast tego wydajniejszego INNER JOIN.
Z góry przepraszam za nieznajomość składni Yii2, ale wydaje się istotne, aby znać skuteczne alternatywne podejście, które może pomóc w rozwiązaniu problemu.