MW211 EXIT

devlog
SQL/内訳数
2012年06月30日
┌──────────────────────────────────────┐
│a                                                                           │
│└b                                                                         │
│  └c                                                                       │
└──────────────────────────────────────┘
上記のような階層になっていて、a毎の内訳数をそれぞれで得たいとき。

以下のようにやってはダメ。
┌──────────────────────────────────────┐
│SELECT a.id,                                                                │
│       COUNT(b.*) AS count_b,                                               │
│       COUNT(c.*) AS count_c                                                │
│    FROM a                                                                  │
│        LEFT JOIN b ON b.a_id = a.id                                        │
│        LEFT JOIN c ON c.a_id = a.id                                        │
│    GROUP BY a.id                                                           │
└──────────────────────────────────────┘
「count_b」も「count_c」もおっきな数になる(a×b×cの組み合わせ総数になる)。

以下のようにすればよい。
┌──────────────────────────────────────┐
│SELECT a.id,                                                                │
│       COUNT(DISTINCT b.*) AS count_b,                                      │
│       COUNT(DISTINCT c.*) AS count_c                                       │
│    FROM a                                                                  │
│        LEFT JOIN b ON b.a_id = a.id                                        │
│        LEFT JOIN c ON c.a_id = a.id                                        │
│    GROUP BY a.id                                                           │
└──────────────────────────────────────┘
分類:SQL