如何用GROUP BY和HAVING筛选全为true的playlist_id与item_id分组
筛选分组内所有记录均满足条件的SQL实现
你需要筛选出playlist_id和item_id分组中**所有passed字段均为true**的记录,原SQL的问题在于GROUP BY后直接在HAVING中使用passed = true,这只会保留分组中存在至少一条passed=true的记录,而非全部为true的分组。
以下是两种可行的实现方式:
方法一:通过子查询筛选有效分组后关联原表
先找出所有不存在passed=false的分组,再关联原表获取完整记录:
SELECT t.* FROM temp_table t INNER JOIN ( SELECT playlist_id, item_id FROM temp_table GROUP BY playlist_id, item_id -- 统计分组内false的数量,等于0说明无false记录 HAVING COUNT(CASE WHEN passed = false THEN 1 END) = 0 ) valid_groups ON t.playlist_id = valid_groups.playlist_id AND t.item_id = valid_groups.item_id;
如果你的数据库支持布尔聚合函数(如PostgreSQL的BOOL_AND),可以简化子查询的HAVING子句:
HAVING BOOL_AND(passed) = true
方法二:用NOT EXISTS排除存在不符合条件记录的分组
直接检查当前行所在的分组中是否存在passed=false的记录,若不存在则保留该行:
SELECT t.* FROM temp_table t WHERE NOT EXISTS ( SELECT 1 FROM temp_table t2 WHERE t2.playlist_id = t.playlist_id AND t2.item_id = t.item_id AND t2.passed = false );
两种方法都能得到你期望的结果:
playlist_id | item_id | passed ----------------------------------------- 123 | 112 | true 789 | 212 | true
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

