首页 > 多表查询和聚合函数

多表查询和聚合函数

我们的业务中有一个简单的一对多模型:

  1. 有三个schema a b c
  2. a与b 为 一对多
  3. b与c 为 一对多

需求如下:

现在想把所有的a的项目列出来,并查出与a有关联的b有多少个(大于等于0),还有查出与a相关的c有多少个(大于等于0)

这样的sql在MySQL中应该怎么写

PS: 尽量减少使用子查询的方式。

谢谢各位了~


大家好,不好意思,可能是业务特殊性,我已经自己找到答案了。

select a,count(distinct b.id) as bcount, count(distinct c.id) as ccount
from a
left join b on a.id = b.a_id
left join c on b.id = c.b_id
group by a.id

这个可以实现我的需求,大家也可以自己尝试一下。
过一会我给贴出示例。。


严格范式的表结构设计很难避免子查询的方式,可以接受冗余的话就在b和c存一个a的关联ID,这样查询就只是单表查询统计了,用空间换时间;
还有一种方法是在a(或者新增一张统计表)里面增加两个统计字段,分别表示关联b和c的数量,查询非常简单,就是更新维护数量比较麻烦。


先查a的所有项目,然后以a为条件去b查,然后将b的结果组合为查询条件,在去c查

应该是三次sql查询,可能后两次要where in


结果集1:查询b表、c表关联group by a表主键(b表中应该有)统计出与a表相关的c表数据条数;
结果集2:查询b表group by a表主键(b表应该有)统计出与a表相关的b表数据条数;
查询a表 分别left join 结果集1和2 就能得到想要的数据了。

【热门文章】
【热门文章】