SQL查询:如何找出不存在status=3记录的用户?
原表结构与数据
| user_id | status |
|---|---|
| 1 | 3 |
| 1 | 5 |
| 2 | 3 |
| 2 | 1 |
| 3 | 5 |
需求说明
找出不存在status=3记录的用户
解决方案
方法1:NOT EXISTS子查询
这是最直观的写法,直接检查每个用户是否没有status=3的关联记录:
SELECT DISTINCT user_id FROM your_table t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.user_id = t1.user_id AND t2.status = 3 );
用DISTINCT确保同一用户只返回一次,避免因多条记录重复输出。
方法2:LEFT JOIN + IS NULL
通过左连接匹配status=3的记录,筛选出匹配失败的用户:
SELECT DISTINCT t1.user_id FROM your_table t1 LEFT JOIN your_table t2 ON t1.user_id = t2.user_id AND t2.status = 3 WHERE t2.user_id IS NULL;
方法3:GROUP BY + HAVING
按用户分组后,统计status=3的记录数,筛选计数为0的用户:
SELECT user_id FROM your_table GROUP BY user_id HAVING SUM(CASE WHEN status = 3 THEN 1 ELSE 0 END) = 0;
也可以用更简洁的写法(多数主流数据库支持):
SELECT user_id FROM your_table GROUP BY user_id HAVING COUNT(CASE WHEN status = 3 THEN 1 END) = 0;
COUNT会忽略NULL值,当status≠3时CASE返回NULL,不会被计入统计,计数为0即代表该用户无status=3的记录。
内容的提问来源于stack exchange,提问作者CHI QUEI LIN
相关产品推荐
相关产品推荐

