根据关联表记录数及特定type值查询Family表family_id的SQL问题
根据关联表记录数及特定type值查询Family表family_id的SQL问题
看起来你在处理两张关联表的统计查询,我来帮你修正并梳理这两个请求的SQL语句,先明确每个需求的核心逻辑:
先理清楚你的表结构
Family表:family_Name | family_id(主键是family_id)Types表:family_fk | type(family_fk关联Family.family_id,一个家庭可以对应多个类型)
请求1:获取仅有一种类型且该类型为'multiple'的family_id
你原来的SQL问题在于:用WHERE it.type = 'multiple'提前过滤了非'multiple'的记录,导致分组后无法判断该家庭是否存在其他类型。哪怕某个家庭同时有'multiple'和其他类型,你的语句只要'multiple'出现一次就会被选中,这不符合“只有一个类型=multiple”的要求。
正确的写法需要同时满足两个条件:该家庭的所有类型只有'multiple'这一种,且类型总数为1(如果业务允许同一个家庭重复出现'multiple'类型,可去掉数量限制):
SELECT f.family_id FROM Family f JOIN Types t ON f.family_id = t.family_fk GROUP BY f.family_id -- 确保该家庭只有一种类型,且这个类型是'multiple' HAVING COUNT(DISTINCT t.type) = 1 AND MAX(t.type) = 'multiple'; -- 因为只有一种类型,MAX/MIN结果一致
另一种更直观的写法(用排除法):
SELECT f.family_id FROM Family f JOIN Types t ON f.family_id = t.family_fk WHERE t.type = 'multiple' -- 排除掉存在其他类型的家庭 AND NOT EXISTS ( SELECT 1 FROM Types t2 WHERE t2.family_fk = f.family_id AND t2.type != 'multiple' ) GROUP BY f.family_id HAVING COUNT(*) = 1; -- 可选:如果不允许同一个家庭重复出现'multiple'则保留
请求2:获取有多种类型(数量>1)且包含'multiple'的family_id
这个需求的核心是:家庭至少有2种不同类型,且其中一种是'multiple'。可以用分组统计+条件判断实现:
SELECT f.family_id FROM Family f JOIN Types t ON f.family_id = t.family_fk GROUP BY f.family_id -- 满足两个条件:类型数量大于1,且存在'multiple'类型 HAVING COUNT(DISTINCT t.type) > 1 AND SUM(CASE WHEN t.type = 'multiple' THEN 1 ELSE 0 END) > 0;
或者用EXISTS先筛选出包含'multiple'的家庭,再统计类型数量:
SELECT f.family_id FROM Family f JOIN Types t ON f.family_id = t.family_fk WHERE EXISTS ( SELECT 1 FROM Types t2 WHERE t2.family_fk = f.family_id AND t2.type = 'multiple' ) GROUP BY f.family_id HAVING COUNT(DISTINCT t.type) > 1;
备注:内容来源于stack exchange,提问作者MAMMIA
相关产品推荐
相关产品推荐

