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

如何通过聚合过滤特定行?MySQL新手技术求助

用GROUP BY实现需求的方案

首先明确核心逻辑:我们需要保留的是col1和col2的组合从未出现过col3、col4同时为true的所有行——因为a)和b)覆盖的是所有存在这类行的col1+col2组合的全部记录。

方案1:分组标记+关联筛选

先通过GROUP BY分组,统计每个col1+col2组合是否存在目标行,再关联原表筛选符合条件的记录:

SELECT t.*
FROM your_table t
JOIN (
    SELECT 
        col1, 
        col2, 
        -- 标记该组合是否存在col3和col4均为true的行
        MAX(CASE WHEN col3 = true AND col4 = true THEN 1 ELSE 0 END) AS has_true_pair
    FROM your_table
    GROUP BY col1, col2
) g ON t.col1 = g.col1 AND t.col2 = g.col2
WHERE g.has_true_pair = 0;

方案2:利用MySQL布尔特性简化写法

MySQL中true等价于1、false等价于0,可简化统计逻辑:

SELECT t.*
FROM your_table t
JOIN (
    SELECT col1, col2
    FROM your_table
    GROUP BY col1, col2
    -- MAX值为0表示该组合无任何一行满足col3和col4均为true
    HAVING MAX(col3 AND col4) = 0
) g ON t.col1 = g.col1 AND t.col2 = g.col2;

和子查询方式的对比

你用子查询的思路可能是先找出需排除的col1+col2组合,再用NOT IN/NOT EXISTS过滤:

-- 子查询方式示例
SELECT *
FROM your_table
WHERE (col1, col2) NOT IN (
    SELECT col1, col2
    FROM your_table
    WHERE col3 = true AND col4 = true
);

GROUP BY方式是先做一次分组统计再关联筛选,在数据量较大时,若col1、col2有合适索引,分组统计的性能会更稳定。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:10:02