MySQL查询问题:如何仅获取所有子项已删除的父行
解决方法:获取所有子项均已删除的父行(完整数据)
让我帮你搞定这个查询问题!首先我们明确核心需求:要找出**自身未被删除(is_deleted=0),且所有子项都已被删除(is_deleted=1)**的父行,并且返回父行的完整数据。
原查询的问题分析
你的原查询有两个关键问题:
- 语法错误:
sum(case when is_deleted 0 then 1 else 0)缺少比较运算符,应该写成sum(case when is_deleted = 0 then 1 else 0 end) - 硬编码子ID列表:
id in (1, 2, 3, 5, 7, 9)是固定的子项ID,没有覆盖父行的所有子项,这是导致错误返回父ID 1、4的根本原因
正确的查询语句
这里提供两种可靠的实现方式,都能返回符合要求的父行完整数据:
方法1:使用 NOT EXISTS(推荐,逻辑清晰)
SELECT d.* FROM draft d WHERE d.parent_id IS NULL -- 筛选父行(parent_id为null) AND d.is_deleted = 0 -- 父行自身未被删除 AND NOT EXISTS ( -- 检查是否存在未删除的子项,不存在则符合条件 SELECT 1 FROM draft child WHERE child.parent_id = d.id AND child.is_deleted = 0 );
方法2:使用 GROUP BY + HAVING 统计子项状态
SELECT d.* FROM draft d JOIN ( -- 先统计每个父ID的未删除子项数量,筛选出数量为0的父ID SELECT parent_id FROM draft WHERE parent_id IS NOT NULL -- 只处理子项 GROUP BY parent_id HAVING SUM(CASE WHEN is_deleted = 0 THEN 1 ELSE 0 END) = 0 ) child_stats ON d.id = child_stats.parent_id WHERE d.is_deleted = 0; -- 确保父行自身未被删除
结果验证
根据你提供的表数据:
- 父行1:存在未删除的子项2 → 不符合条件
- 父行4:存在未删除的子项7 → 不符合条件
- 父行8:所有子项(仅9)已删除 → 符合条件
上述两种查询都会返回父行8的完整数据,完全符合需求。
内容的提问来源于stack exchange,提问作者EI-01
相关产品推荐
相关产品推荐

