Mysql
 sql >> Baza danych >  >> RDS >> Mysql

SELECT podzapytanie z warunkiem WHERE w Yii2 find() / QueryBuilder

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zmienić zestaw znaków z latin1 na UTF8 w MySQL?

  2. Dziwne zachowanie Laravel Homestead Połączenie z bazą danych

  3. Dodatkowe dane rejestracyjne użytkownika Django nie są zapisywane w bazie danych

  4. Jak przestawiać tabele w MySQL

  5. Ustaw limit i przesuń nieprawidłowe umieszczenie w zapytaniu