如何统计status为X的数据?需排除存在Y状态记录的用户
问题与解决方案
数据表结构
id | user_id | status 1 | 34 | x 2 | 35 | x 3 | 42 | x 4 | 42 | y
需求说明
需要统计status为x的记录,但只要某个用户存在status为y的记录,该用户所有x状态的记录都不纳入统计。按此规则,原本3条x记录中,用户42的1条x记录需排除,最终统计结果应为2条。
修正后的SQL查询
你提供的SQL存在两处问题:一是未明确过滤status = 'x',二是SELECT *搭配GROUP BY user_id在多数SQL规范下不合法(除非仅需获取分组后的单个用户样本)。根据需求,正确写法如下:
1. 查询所有符合条件的x状态记录
SELECT * FROM logs WHERE user_id NOT IN (SELECT user_id FROM logs WHERE status = 'y') AND status = 'x';
2. 统计符合条件的记录总数
如果仅需统计条数,使用COUNT(*):
SELECT COUNT(*) AS valid_x_count FROM logs WHERE user_id NOT IN (SELECT user_id FROM logs WHERE status = 'y') AND status = 'x';
逻辑说明
子查询SELECT user_id FROM logs WHERE status = 'y'会先筛选出所有存在y状态记录的用户ID,外层查询再排除这些用户,同时保留status为x的记录,完全匹配需求逻辑。
内容的提问来源于stack exchange,提问作者boldsinas101
相关产品推荐
相关产品推荐

