我们的业务中有一个简单的一对多模型:
- 有三个schema a b c
- a与b 为 一对多
- 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 就能得到想要的数据了。