sql >> データベース >  >> RDS >> Mysql

Yii2 find()/QueryBuilderのWHERE条件を使用したSELECTサブクエリ

    SQLの観点から見たクエリの例では、select句内で「相関サブクエリ」を使用していますが、これはクエリを形成する非常に非効率的な方法であることがよくあります。

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

    一見すると複雑で効率が悪いように見えるかもしれませんが、一般的には、select句で「相関サブクエリ」を避け、代わりに「派生テーブル」を使用して次のように置き換える方がパフォーマンスに優れています。

    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
    

    select句を使用した相関サブクエリはNULLを返す可能性があることに注意してください。これにより、派生テーブルで置き換える場合、同等の結合タイプはLEFT OUTER JOIN(または単にLEFT JOIN)になります。これにより、NULLの結果も許可されます。ただし、列にNULLが必要ない場合は、代わりに、より効率的なINNERJOINを使用してください。

    Yii2構文がわからないことを事前に謝罪しますが、問題の解決に役立つ可能性のある効果的な代替アプローチを知っておくことが適切であるようです。



    1. MariaDBでデータベースの文字セットと照合を設定する

    2. Dockerでコンテナとして実行されているMySQLDBに接続するにはどうすればよいですか?

    3. DEFAULT値を使用したMySQLINSERT/UPDATEステートメントの準備

    4. セロリから挿入を実行するときにmysqlコマンドが同期していません