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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 02:55:12