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

如何用MySQL过滤全部程序已完成的调度程序组数据?

解决MySQL过滤全完成调度组的问题

没问题,我来帮你搞定这个需求——我们的目标是只保留那些至少有一个未完成程序的组的所有行,把全完成的组(比如你提到的group 2)彻底排除掉。

首先假设你的表结构大概是这样的(如果字段名有差异,你可以对应调整):
schedule_tasks 表包含字段:group_id(组ID)、task_id(程序ID)、order(调度顺序)、is_completed(完成状态,0=未完成,1=完成)

下面给你几种实用的实现方法:

方法1:IN子查询(直观易懂)

先通过子查询找出所有存在未完成程序的组ID,再返回这些组的所有行:

SELECT t.*
FROM schedule_tasks t
WHERE t.group_id IN (
    SELECT group_id
    FROM schedule_tasks
    WHERE is_completed = 0
);

原理:子查询筛选出所有包含未完成任务的组,主查询只拉取这些组的数据,自然就排除了全完成的组。

方法2:EXISTS子查询(性能更优)

如果你的表数据量较大,EXISTS通常比IN的性能更好,因为它一旦找到匹配项就会停止检索:

SELECT t.*
FROM schedule_tasks t
WHERE EXISTS (
    SELECT 1
    FROM schedule_tasks t2
    WHERE t2.group_id = t.group_id
      AND t2.is_completed = 0
);

原理:对每一行数据,检查同组内是否存在未完成的程序,存在则保留该行,否则过滤。

方法3:分组聚合+JOIN(灵活扩展)

如果需要更复杂的组级判断(比如统计未完成数量),可以用分组聚合的方式先筛选符合条件的组,再关联原表:

SELECT t.*
FROM schedule_tasks t
JOIN (
    SELECT group_id
    FROM schedule_tasks
    GROUP BY group_id
    HAVING SUM(CASE WHEN is_completed = 0 THEN 1 ELSE 0 END) > 0
) g ON t.group_id = g.group_id;

原理:分组后统计每个组的未完成程序数量,只保留数量大于0的组,再关联原表获取这些组的所有行。

注意事项

  • 如果你的完成状态不是0/1(比如用'completed'/'pending'字符串),只需要把WHERE或CASE里的条件值改成对应的状态即可。
  • 确保group_id字段有索引,这样以上查询的性能会更出色。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:14:04