0

3 つのテーブル ジョイン結合全体でリレーションを個別にカウントします。

2 つのテーブルを結合するとき、count 句と group by 句を使用して、1 つのテーブルの ID が別のテーブルのリレーションとして表示される回数をカウントする方法は知っていますが、2 つのテーブルとのリレーションの数を 2 つカウントする方法がわかりません。

次のサンプル データを含む 3 つのテーブル A、B、および C を検討してください。

Table A         Table B          Table C

|id|           |id|A_id|         |id|A_id|
 --             -- ----           -- ----
|1 |           |1 |1   |         |1 |1   |
|2 |           |2 |1   |         |2 |3   |
|3 |           |3 |3   |         |3 |2   |
|4 |           |3 |4   |         |4 |3   |

テーブル B と C の両方で、列 A_id を NULL にすることはできませんが、テーブル C では、列 B_id を NULL にすることができます。

テーブル AI のすべてのエントリに対して、テーブル B の関連エントリの数と、テーブル C の関連エントリの数を取得するようなクエリが必要です。上記のデータの場合、次を返すクエリが必要です。

A_id|Count(B)|Count(C)
---- -------- --------
|1  |2       |1
|2  |0       |1
|3  |1       |2
|4  |1       |0
4

4 に答える 4

2

COUNTサブクエリでそれらを指定する必要があります。

SELECT  a.ID, 
        IFNULL(b.`COUNT(B)`, 0) `COUNT(B)`,
        IFNULL(c.`COUNT(C)`, 0) `COUNT(C)`
FROM    tableA a
        LEFT JOIN 
        (
          SELECT bb.A_ID, COUNT(*) `COUNT(B)`
          FROM   tableB bb
          GROUP BY A_ID
        ) b ON a.id = b.A_ID
        LEFT JOIN 
        (
          SELECT cc.A_ID, COUNT(*) `COUNT(C)`
          FROM   tableC cc
          GROUP BY A_ID
        )c ON a.ID = c.A_ID
于 2012-12-19T00:36:42.210 に答える
0

これは、サブセレクトを使用する必要がありますが、最初に聞こえるよりも少し単純です。

SELECT a.id, COALESCE(b.count, 0), COALESCE(c.count, 0)
FROM a
LEFT JOIN (SELECT a_id, COUNT(*) as count
           FROM b
           GROUP BY a_id) b
on b.a_id = a.id
LEFT JOIN (SELECT a_id, COUNT(*) as count
           FROM c
           GROUP BY a_id) c
on c.a_id = a.id

に参加するにグループ化を実行する必要がaあります。これは、子テーブルの一部に重複が生じ、結果が失われる可能性があるためです。

于 2012-12-19T00:44:32.473 に答える
0

(B.id, A_id) と (C.id, A_id) の組み合わせが一意である場合、これを使用できます。

select
  A.ID, count(distinct B.id), count(distinct C.id)
from
  A left join B on a.ID = B.A_ID
  left join C on a.ID=C.A_ID
group by A.id

そうでない場合は、サブクエリを使用してカウントを行う必要があります。

于 2012-12-19T00:52:34.740 に答える
0

サブクエリを使用するというアイデアは、昨夜ベッドにいるときに思いついたので、他の人が提案したことを嬉しく思います。私のクエリは、上記の他の提案よりも単純で、非常に高速に実行されるように思われますが、私のクエリが実際に既に与えられたものよりも優れているか悪いかについての情報をいただければ幸いです。

SELECT 
    TableA.id, 
    (SELECT COUNT(*) FROM TableB where TableB.A_id = TableA.id) countB,
    (SELECT COUNT(*) FROM TableC where TableC.A_id = TableA.id) countC
FROM TableA;
于 2012-12-19T14:26:32.940 に答える