使用2个不同的表获取一对多关系的计数

时间:2017-04-20 06:30:27

标签: mysql sql

我有3张桌子: 1:A

id   name
1    jhon

2:B

id a_id name
1    1   b1
2    1   b2
3    1   b3

3:C

id a_id name
1    1   c1

这里A有很多B和很多C

现在我需要一个与A相关的number of Bnumber of C计数。 我知道这里2个不同的Query可以帮助我检索属于A的B,C的计数 例如: -

 select count(id) from B where a_id=1;
  select count(id) from C where a_id=1;

我正在尝试使用连接查询解决它,例如>

select count(b.id) , count(c.id) from A  a
left join B b on b.a_id = a.id
left join C c on c.a_id = a.id
where a.id = 1;

但它给出了错误的结果

count(b.id) count(c.id)
3            3

这是因为a有3 B这就是为什么我得到错误的结果为C的计数 我可以用子查询解决它,但我不想用子查询或2个不同的查询来解决它。

伙计们,您可以在这里通过一个查询来解决这个问题,而不使用子查询。 提前谢谢。

3 个答案:

答案 0 :(得分:0)

您可以使用子查询来获取表BC的聚合版本:

SELECT A.*, B.cnt_b, C.cnt_c
FROM A
LEFT JOIN (
   SELECT a_id, COUNT(*) AS cnt_b
   FROM B
   GROUP BY a_id
) AS B ON A.a_id = B.a_id
LEFT JOIN (
   SELECT a_id, COUNT(*) AS cnt_c
   FROM C
   GROUP BY a_id 
) AS C ON A.a_id = C.a_id
WHERE A.a_id = 1

答案 1 :(得分:0)

请尝试以下方法......

SELECT A.id as id,
       countB,
       countC
FROM A
LEFT JOIN ( SELECT a_id AS id,
                   COUNT( a_id ) as countB
            FROM B
            GROUP BY a_id
          ) B_ids ON A.id = B_ids.id
LEFT JOIN ( SELECT a_id AS id,
                   COUNT( a_id ) as countC
            FROM C
            GROUP BY a_id
          ) C_ids ON A.id = C_ids.id
GROUP BY id
ORDER BY id;

(以下说明......)

如果您有任何问题或意见,请随时发表评论。

答案 2 :(得分:0)

Distinct计数的帮助下,我已经实现了它。使用Distinct计数将删除重复的ID计数。

select count(Distinct b.id) , count(Distinct c.id) from A  a
left join B b on b.a_id = a.id
left join C c on c.a_id = a.id
where a.id = 1;