【问题标题】:How many B and C has A?A 有多少个 B 和 C?
【发布时间】:2012-08-09 19:44:42
【问题描述】:

我有这张桌子:

A:
id
1
2

B:
id a_id
1  1
2  1
3  1

C:
id a_id
1  1
2  1
3  2

我需要这个结果:

A, CountB, CountC
1,      3,      2
2,      0,      1

这个尝试不起作用:

SELECT 
    A.id, COUNT(B.id), COUNT(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

不使用关联查询的sql语句怎么办?

【问题讨论】:

    标签: sql database count


    【解决方案1】:

    您的以下变体应该可以工作:

    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 
    

    但是,有些人(比如我自己)认为使用 count distinct 是一种逃避。问题是来自 B 和来自 C 的行相互干扰,在连接中相乘。所以,你也可以独立做每个join,然后把结果放在一起:

    select ab.id, cntB, cntC
    from (select a.id, count(*) as cntB
          from A left outer join
               B
               on A.id = B.a_id
          group by a.id
         ) ab join
         (select a.id, count(*) as cntC
          from A left outer join
               C
               on A.id = C.a_id
          group by a.id
         ) ac
         on ab.id = ac.id
    

    仅用于计数,第一种形式很好。如果您需要进行其他汇总(例如,对一个值求和),那么您通常需要拆分为组件查询。

    【讨论】: