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

複数の左結合のMySQLCOUNT-最適化

    クエリをリファクタリングする必要があります。これを行うには、クエリがデータを収集する方法を並べ替えます。どうやって?

    • 最初にWHERE句を適用します
    • 最後にJOINを適用する

    元のクエリは次のとおりです:

    SELECT t1.num1,t2.num2,t3.num3 
    FROM member m 
    LEFT JOIN 
    ( 
       SELECT member_id,COUNT(*) as num1 
       FROM table1 
       GROUP BY member_id 
    ) t1 ON t1.member_id = m.member_id 
    LEFT JOIN 
    ( 
       SELECT member_id,COUNT(*) as num2 
       FROM table2 
       GROUP BY member_id 
    ) t2 ON t2.member_id = m.member_id 
    LEFT JOIN 
    ( 
       SELECT member_id,COUNT(*) as num3 
       FROM table3 
       GROUP BY member_id 
    ) t3 ON t3.member_id = m.member_id 
    WHERE m.member_id = 27 
    

    これが新しいクエリです

    SELECT
       IFNULL(t1.num1,0) num1,
       IFNULL(t1.num2,0) num2,
       IFNULL(t1.num3,0) num3
    FROM
    (
       SELECT * FROM member m 
       WHERE member_id = 27
    ) 
    LEFT JOIN 
    ( 
       SELECT member_id,COUNT(*) as num1 
       FROM table1 
       WHERE member_id = 27
       GROUP BY member_id 
    ) t1 ON t1.member_id = m.member_id 
    LEFT JOIN 
    ( 
       SELECT member_id,COUNT(*) as num2 
       FROM table2 
       WHERE member_id = 27
       GROUP BY member_id 
    ) t2 ON t2.member_id = m.member_id 
    LEFT JOIN 
    ( 
       SELECT member_id,COUNT(*) as num3 
       FROM table3 
       WHERE member_id = 27
       GROUP BY member_id 
    ) t3 ON t3.member_id = m.member_id 
    ;
    

    ところで、member mを変更しました into SELECT * FROM member m WHERE member_id = 27 メンバー27に関する情報が必要な場合に備えて、IFNULLも追加しました。 countがNULLの場合、各結果に対して関数を実行して0を生成します。

    絶対に確認する必要があります

    • member_idはメンバーテーブルの主キーです
    • member_idは、table1、table2、およびtable3でインデックス付けされます

    試してみてください!!!



    1. ジャンクションテーブルで編集を実行する方法

    2. 複数の列で複数のアイテムを検索する

    3. RESTfullの方法でデータベース列のnullエントリをカウントします

    4. Oracleでビューを作成する方法