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

MySQL查询问题:如何仅获取所有子项已删除的父行

解决方法:获取所有子项均已删除的父行(完整数据)

让我帮你搞定这个查询问题!首先我们明确核心需求:要找出**自身未被删除(is_deleted=0),且所有子项都已被删除(is_deleted=1)**的父行,并且返回父行的完整数据。

原查询的问题分析

你的原查询有两个关键问题:

  1. 语法错误:sum(case when is_deleted 0 then 1 else 0) 缺少比较运算符,应该写成 sum(case when is_deleted = 0 then 1 else 0 end)
  2. 硬编码子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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:49:09