Mysql
 sql >> база данни >  >> RDS >> Mysql

SELECT подзаявка с условие WHERE в Yii2 find() / QueryBuilder

Примерната заявка, от гледна точка на SQL, използва „корелирана подзаявка“ в клаузата за избор и често това е много неефективен начин за формиране на заявка.

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

Въпреки че на пръв поглед може да изглежда по-сложно и следователно по-малко ефективно, като цяло е по-добре за производителността да се избягват „корелирани подзаявки“ в клауза за избор и вместо това да се заменят с помощта на „производна таблица“, както следва:

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

Забележете, корелирана подзаявка с клауза за избор може да върне NULL и поради това, ако се заменят с извлечена таблица, еквивалентният тип на присъединяване е LEFT OUTER JOIN (или просто LEFT JOIN), тъй като това също позволява резултат NULL. Ако обаче не се нуждаете от NULL за колоната, използвайте вместо това по-ефективното INNER JOIN.

Предварително се извиняваме, че не знаете синтаксиса на Yii2, но изглежда уместно да знаете ефективен алтернативен подход, който може да помогне за решаването на проблема.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. VB.NET MySQL връзка

  2. PHP MySQLi multi_query подготвен оператор

  3. ГРЕШКА 2006 (HY000):MySQL сървърът е изчезнал

  4. Проблем с много бази данни?

  5. Какъв тип данни на MySQL трябва да се използва за географска ширина/дължина с 8 знака след десетичната запетая?