扫码关注官方订阅号
我们的业务中有一个简单的一对多模型:
需求如下:
现在想把所有的a的项目列出来,并查出与a有关联的b有多少个(大于等于0),还有查出与a相关的c有多少个(大于等于0)
这样的sql在MySQL中应该怎么写
MySQL
PS: 尽量减少使用子查询的方式。
谢谢各位了~
小伙看你根骨奇佳,潜力无限,来学PHP伐。
大家好,不好意思,可能是业务特殊性,我已经自己找到答案了。
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
这个可以实现我的需求,大家也可以自己尝试一下。过一会我给贴出示例。。
先查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 就能得到想要的数据了。
严格范式的表结构设计很难避免子查询的方式,可以接受冗余的话就在b和c存一个a的关联ID,这样查询就只是单表查询统计了,用空间换时间; 还有一种方法是在a(或者新增一张统计表)里面增加两个统计字段,分别表示关联b和c的数量,查询非常简单,就是更新维护数量比较麻烦。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
大家好,不好意思,可能是业务特殊性,我已经自己找到答案了。
这个可以实现我的需求,大家也可以自己尝试一下。
过一会我给贴出示例。。
先查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 就能得到想要的数据了。
严格范式的表结构设计很难避免子查询的方式,可以接受冗余的话就在b和c存一个a的关联ID,这样查询就只是单表查询统计了,用空间换时间;
还有一种方法是在a(或者新增一张统计表)里面增加两个统计字段,分别表示关联b和c的数量,查询非常简单,就是更新维护数量比较麻烦。