mysql - 多表查询和聚合函数
伊谢尔伦
伊谢尔伦 2017-04-17 11:29:50
[MySQL讨论组]

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

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

需求如下:

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

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

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

谢谢各位了~

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(4)
巴扎黑

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

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

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

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的数量,查询非常简单,就是更新维护数量比较麻烦。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号