1


0

MySQL-1つの結合テーブルの異なる条件で異なるフィールドをカウントする

次の列を含むTable1という仮想テーブルがあります。

  • id

  • 条件1

  • 条件2

  • joinable_key

別のMain_Tableがあり、そのIDは最初の1つのjoinable_keyに対応しています。

条件1と条件2の両方に従ってTable1の行を個別にカウントできるように、それらを結合したいと思います。つまり、「count(Table1.condition1)をfirst_condition、countとして実行できるようにしたい」 (Table1.condtion2)as second_condition」を選択クエリで。

クエリはおそらく次のようになります。

SELECT  Main_Table.some_column, COUNT(Table1.condition1) AS first_condition, COUNT(Table1.condtion2) AS second_condition
FROM  Main_Table
LEFT JOIN Table1 AS T1 on (T1.joinable_key = Main_Table.id AND T1.condition1 = 'something')
LEFT JOIN Table1 AS T2 on (T2.joinable_key = Main_Table.id AND T2.condition2 = 'something else')
GROUP BY (Main_Table.id)

ただし、これを実行すると、両方のカウント結果が等しくなり、実際には互いに乗算されます。 Table1のエントリを持たない結果も含めて、すべての結果を最終出力に含めることが必須です。つまり、Main_Table.idに等しいjoinable_keyを持つTable1に行がない場合、それも含める必要があります。

誰かが実際に2つの別々のクエリを実行してPHPで処理することを提案する前に-はい、私はそれがなぜそしてどのように実行できるかを知っていますが、私の目標はこのマルチカウントがすべて1つのクエリで実行できるかどうかを見つけることです。

ありがとうございました

2 Answer


4


SELECT some_column,
       (SELECT COUNT(1)
          FROM Table1
         WHERE mt.id = joinable_key
           AND condition1 = 'something'
       ) AS first_condition,
       (SELECT COUNT(1)
          FROM Table1
         WHERE mt.id = joinable_key
           AND condition2 = 'something else'
       ) AS second_condition
  FROM MainTable mt


0


SELECT  Main_Table.some_column,
        SUM(t1.condition1 = 'something') AS first_condition,
        SUM(t1.condition2 = 'something_else') AS second_condition
FROM    Main_Table
LEFT JOIN
        Table1 AS t1
ON      t1.joinable_key = Main_Table.id
        AND
        (
        t1.condition1 = 'something'
        OR
        t1.condition2 = 'something else'
        )
GROUP BY
        Main_Table.id

condition1`と condition2`の両方が選択的である場合、この構文はより効率的です:

SELECT  Main_Table.some_column,
        (
        SELECT  COUNT(*)
        FROM    table1 t1
        WHERE   t1.joinable_key = main_table.id
                AND t1.condition1 = 'something'
        ),
        (
        SELECT  COUNT(*)
        FROM    table1 t1
        WHERE   t1.joinable_key = main_table.id
                AND t1.condition2 = 'something_else'
        )
FROM    Main_Table

以下のインデックスを作成してください。

table1 (id, condition1)
table1 (id, condition2)

これが速く動作するために。