如何通过聚合过滤特定行?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
相关产品推荐
相关产品推荐

