如何从Data表筛选对question_id 1、2、3均作答0的customer_id
解决方法:筛选对指定问题全答0的用户
嘿,我懂你遇到的问题了——你原来写的SQL只是找出了那些至少对1、2、3里某一个问题答了0的用户,但没保证这三个问题他们全都答了0,甚至可能有的用户只答了其中两个问题(且都是0),或者某个问题答了1但另一个答了0,都会被误选进来。这就是为什么结果不符合预期的原因。
给你几种靠谱的解决方案,按需选就行:
方法1:GROUP BY + HAVING(最推荐,扩展性强)
这是处理这类“全满足”条件最常用的方式,逻辑清晰还能应对后续增加问题的情况:
SELECT customer_id FROM Data WHERE question_id IN (1, 2, 3) GROUP BY customer_id HAVING COUNT(DISTINCT question_id) = 3 -- 确保用户确实答了这三个问题 AND SUM(value) = 0; -- 所有作答值都是0,总和才会是0
补充说明:
如果你的value字段可能出现负数(比如除了0还有-1这种情况),那把SUM(value) = 0换成MAX(value) = 0 AND MIN(value) = 0更稳妥,这样能确保所有记录的value都是0。
方法2:排除法(用NOT EXISTS)
思路是先找出所有没有对这三个问题答非0的用户,同时确保他们确实答了全部三个问题:
SELECT DISTINCT customer_id FROM Data d_main WHERE question_id IN (1, 2, 3) AND NOT EXISTS ( SELECT 1 FROM Data d_sub WHERE d_sub.customer_id = d_main.customer_id AND d_sub.question_id IN (1, 2, 3) AND d_sub.value != 0 ) GROUP BY customer_id HAVING COUNT(DISTINCT question_id) = 3;
方法3:多表JOIN(适合问题数量少的场景)
如果只有三个问题,这种写法非常直观,把每个问题的记录关联起来,确保每个都为0:
SELECT d1.customer_id FROM Data d1 JOIN Data d2 ON d1.customer_id = d2.customer_id AND d2.question_id = 2 AND d2.value = 0 JOIN Data d3 ON d1.customer_id = d3.customer_id AND d3.question_id = 3 AND d3.value = 0 WHERE d1.question_id = 1 AND d1.value = 0;
这几种方法都能帮你精准筛选出customer_id=24这个正确结果,试试吧!
内容的提问来源于stack exchange,提问作者vchan
相关产品推荐
相关产品推荐

