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

複数のテーブルでのMySQL結合とCOUNT()

    DISTINCTを使用する必要があります 、ただし、外部キーではなくIDをカウントする必要があります:

    SELECT
        table1.name,
        COUNT(DISTINCT table2.id) AS table2_count,
        COUNT(DISTINCT table3.id) AS table3_count,
        COUNT(DISTINCT table4.id) AS table4_count,
        SUM(table4.size) AS table4_size
    FROM table1
    LEFT JOIN table2 ON table1.id = table2.table1_id
    LEFT JOIN table3 ON table2.id = table3.table2_id
    LEFT JOIN table4 ON table3.id = table4.table3_id
    WHERE table1.id = 1
    

    これがフィドル です。 。

    説明: DISTINCT キーワードは重複する値をすべて削除し、一意の値のリストを作成します。

    COUNT()なしでクエリを実行した場合 およびSUM() 、次のようになります:

    name  table1_id  table2_id  table3_id  size
    test  1          1          1          1024 
    test  1          1          1          200 
    test  1          (null)     (null)     (null) 
    test  1          (null)     (null)     (null) 
    

    したがって、COUNT()を追加すると およびSUM() 、明らかに次のようになります:

    name  table1_id  table2_id  table3_id  size
    test  4          2          2          1224 
    

    ただし、DISTINCTを使用する 重複する値を明確に確認できるため、クエリを使用しても役に立ちません。その結果、次のようになります。

    name  table1_id  table2_id  table3_id  size
    test  1          1          1          1224 
    

    ここで、COUNT()なしでクエリを実行すると およびSUM() 、次のようになります:

    name  table1_id  table2_id  table3_id  size
    test  1          1          1          1024 
    test  1          1          2          200 
    test  2          (null)     (null)     (null) 
    test  3          (null)     (null)     (null) 
    

    COUNT()を追加した場合 およびSUM() 、クエリとまったく同じ結果が得られます:

    name  table1_id  table2_id  table3_id  size
    test  4          2          2          1224 
    

    ただし、今回は異なる値があるため(つまり、すべてが1であるとは限らないため)、DISTINCTを使用して一意の値をカウントするとします。 、次のようになります:

    name  table1_id  table2_id  table3_id  size
    test  3          1          2          1224 
    


    1. mysqlクエリ、結果の特定の配列を選択

    2. MySQL:DELETEがINSERTよりもCPUを集中的に使用するのはなぜですか?

    3. MySQL:ストアドプロシージャで複数のフィールドを複数の変数に選択する

    4. 巨大なパーティションテーブルへのデータロード