如何查询无任何关联评论的产品 现有LEFT JOIN写法是否需加HAVING
问题诊断
你现有的写法确实存在问题:如果某款产品存在关联评论,只是其中某条评论的content字段为空,你的SQL会把这类产品也筛选出来,不符合「完全没有任何关联评论」的需求。
可选解决方案
方案1:用NOT EXISTS实现(最推荐,逻辑直观性能优)
直接判断该产品在评论表中没有任何匹配记录即可,不会被空字段干扰:
SELECT * FROM products p WHERE NOT EXISTS ( SELECT 1 FROM reviews r WHERE r.product_id = p.id );
方案2:修改LEFT JOIN的判断条件
不用判断reviews.content是否为空,改为判断评论表的非空主键(比如reviews.id)是否为空即可:只要产品有至少一条评论,reviews.id就一定会有值,只有完全没有匹配评论时才会为NULL。注意要加DISTINCT避免产品有多个空content评论时返回重复数据:
SELECT DISTINCT p.* FROM products p LEFT JOIN reviews r ON p.id = r.product_id WHERE r.id IS NULL;
方案3:用GROUP BY + HAVING实现
你提到的HAVING子句也可以实现该需求,逻辑是统计每个产品的关联评论数,筛选出评论数为0的产品:
SELECT p.* FROM products p LEFT JOIN reviews r ON p.id = r.product_id GROUP BY p.id HAVING COUNT(r.id) = 0;
内容的提问来源于stack exchange,提问作者friskybunnies
相关产品推荐
相关产品推荐

