多对多关联表/三表结构下,查询多母亲共有的子项方法
嘿,我来帮你搞定这两个多对多关联的查询问题!
问题1:查询所有母亲共有的子项
要找出所有母亲都共同拥有的子项,核心思路是统计每个子项关联的母亲数量,然后筛选出数量等于总母亲数的子项。具体实现步骤如下:
- 先计算数据库中总共有多少个不同的母亲:
SELECT COUNT(DISTINCT CodeMother) AS total_mothers FROM Mother; - 接着统计每个子项关联的母亲数量,筛选出数量等于总母亲数的子项:
这里用SELECT c.CodeChild, c.ChildName FROM Child c JOIN Junction j ON c.CodeChild = j.CodeChild GROUP BY c.CodeChild, c.ChildName HAVING COUNT(DISTINCT j.CodeMother) = (SELECT COUNT(DISTINCT CodeMother) FROM Mother);COUNT(DISTINCT j.CodeMother)是为了避免中间表存在重复关联记录的情况,如果你的Junction表保证每个(CodeMother, CodeChild)组合唯一,也可以简化为COUNT(*) = (...)。
问题2:指定至少2个母亲,查询她们共有的子项
你给出的Select CodeChild From Junction Where CodeMother in ('02','03')语句有个明显的问题:它会返回母亲02或03关联的所有子项,包括只属于其中一个母亲的子项,这不是你要的“共有”结果。
预期结果
假设你的Junction表数据如下:
| CodeMother | CodeChild |
|---|---|
| 02 | 53 |
| 02 | 10 |
| 03 | 53 |
| 03 | 15 |
那么正确的预期结果应该只有53(因为它是02和03都关联的子项),而你的原语句会返回53,10,53,15(去重后是53,10,15),完全不符合需求。
实现方法
我们需要通过分组统计,筛选出在指定母亲列表中出现次数等于母亲数量的子项:
SELECT j.CodeChild, c.ChildName FROM Junction j JOIN Child c ON j.CodeChild = c.CodeChild WHERE j.CodeMother IN ('02','03') GROUP BY j.CodeChild, c.ChildName HAVING COUNT(DISTINCT j.CodeMother) = 2; -- 2是你指定的母亲数量
同样,如果Junction表没有重复关联记录,COUNT(DISTINCT ...)可以换成COUNT(*)。另外,如果你想动态适配任意数量的母亲(比如3个),只需要把IN里的列表和HAVING后的数字对应调整即可。
内容的提问来源于stack exchange,提问作者PoyZ Harmful
相关产品推荐
相关产品推荐

