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

如何用MySQL查询全部成员均为成年人的群组?

用单条SQL查询全为成年人的群组

完全可以用单条SQL实现,不需要手动处理,下面提供几种常用的可行写法:

方法1:NOT EXISTS子查询(推荐,性能通常更优)

通过检查群组下是否不存在未成年人来筛选目标群组:

SELECT g.PK_Groups, g.Groupname
FROM Groups g
WHERE NOT EXISTS (
    SELECT 1
    FROM Person p
    WHERE p.FK_Groups = g.PK_Groups
      AND p.isAdult = 0 -- 假设0代表非成年人,1代表成年人,可根据实际字段取值调整
);

逻辑:对每个群组,子查询会尝试查找该群组下的非成年人。如果子查询无返回结果(即该群组没有未成年人),这个群组就会被选中。

方法2:GROUP BY + HAVING统计筛选

通过分组统计每个群组的未成年人数量,筛选数量为0的群组:

SELECT g.PK_Groups, g.Groupname
FROM Groups g
JOIN Person p ON g.PK_Groups = p.FK_Groups
GROUP BY g.PK_Groups, g.Groupname
HAVING SUM(CASE WHEN p.isAdult = 0 THEN 1 ELSE 0 END) = 0;

如果isAdult是布尔类型(比如MySQL的BOOL、PostgreSQL的BOOLEAN),HAVING子句可以简化为:

HAVING SUM(NOT p.isAdult) = 0;

逻辑:先关联群组和成员表,按群组分组后统计非成年人数量,只保留数量为0的群组。

方法3:LEFT JOIN排除法

通过左连接匹配未成年人记录,排除存在匹配的群组:

SELECT DISTINCT g.PK_Groups, g.Groupname
FROM Groups g
LEFT JOIN Person p ON g.PK_Groups = p.FK_Groups AND p.isAdult = 0
WHERE p.PK_Person IS NULL;

逻辑:左连接群组表和该群组下的未成年人记录,若某个群组没有未成年人,连接后的p.PK_Person会为NULL,最后用DISTINCT去重(避免同一群组多条成年人记录导致结果重复)。

注意:如果isAdult的取值不是0/1(比如用'Y'/'N'表示成年状态),只需将条件中的0替换为对应的非成年标识即可。

内容的提问来源于stack exchange,提问作者Patrick_W

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:50:31