You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

根据关联表记录数及特定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:38:08