如何修正HAVING COUNT语句以查询无点赞、评论操作的用户ID
原SQL失效原因
COUNT() 函数的统计规则是仅跳过NULL值,你写的e.action = 'like'是布尔表达式,无论返回真还是假都属于非NULL值,只要用户存在任意行为记录,两个COUNT的统计结果就至少为1,永远不可能等于0,因此逻辑无法生效。
可行修改方案
方案1:分组聚合写法(语法简洁,适合小表场景)
可以利用SUM统计匹配行数,或者利用COUNT跳过NULL的特性改写:
SELECT e.user_id FROM event e GROUP BY e.user_id HAVING SUM(CASE WHEN e.action IN ('like', 'comment') THEN 1 ELSE 0 END) = 0
也可以拆分条件写:
SELECT e.user_id FROM event e GROUP BY e.user_id HAVING COUNT(IF(e.action = 'like', 1, NULL)) = 0 AND COUNT(IF(e.action = 'comment', 1, NULL)) = 0
方案2:子查询写法(性能更优,适合大表场景)
用NOT EXISTS匹配到用户存在点赞/评论行为就直接跳过,不需要全表分组,执行效率更高:
SELECT DISTINCT e1.user_id FROM event e1 WHERE NOT EXISTS ( SELECT 1 FROM event e2 WHERE e2.user_id = e1.user_id AND e2.action IN ('like', 'comment') )
内容的提问来源于stack exchange,提问作者Zhang Yongheng
相关产品推荐
相关产品推荐

