如何用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
相关产品推荐
相关产品推荐

