如何用SQL查询同时对两款指定产品给出高分评价的用户?
解决同时筛选多产品高分用户的SQL问题
你之前的查询存在的问题
- 第一个查询语法错误(漏写
AND),且逻辑矛盾:同一行记录不可能同时属于产品173和50,因此WHERE子句的条件永远无法匹配到结果。 - 第二个查询的HAVING子句用法错误:GROUP BY user之后,直接使用
product = 173无效——每个用户可能对应多条不同产品的记录,必须通过聚合函数判断该用户是否存在符合条件的评价。 - 第三个查询仅能筛选出对某一个产品打4分的记录,无法确保用户同时满足两个产品的高分要求。
正确的SQL解法
以下三种方法都能实现你的需求:找出同时对产品173、50给出4或5分,且排除user=1的用户。
方法一:GROUP BY + HAVING 统计符合条件的产品数量
SELECT user FROM reviews WHERE user != 1 AND ((product = 173 AND rating >= 4) OR (product = 50 AND rating >= 4)) GROUP BY user HAVING COUNT(DISTINCT product) = 2;
先筛选出目标产品的高分记录,按用户分组后,统计不同产品的数量为2,即可确认该用户同时满足两个产品的评分要求。
方法二:自连接匹配双产品记录
SELECT DISTINCT r1.user FROM reviews r1 JOIN reviews r2 ON r1.user = r2.user WHERE r1.user != 1 AND r1.product = 173 AND r1.rating >= 4 AND r2.product = 50 AND r2.rating >= 4;
通过自连接,分别匹配用户对产品173和50的高分记录,最终得到同时存在两类记录的用户,用DISTINCT避免重复结果。
方法三:EXISTS子查询验证双条件
SELECT DISTINCT user FROM reviews r WHERE user != 1 AND EXISTS ( SELECT 1 FROM reviews WHERE user = r.user AND product = 173 AND rating >= 4 ) AND EXISTS ( SELECT 1 FROM reviews WHERE user = r.user AND product = 50 AND rating >= 4 );
主查询遍历用户,通过两个EXISTS子查询分别验证该用户是否对两个产品都有4/5分的评价,确保双条件同时成立。
内容的提问来源于stack exchange,提问作者Whip
相关产品推荐
相关产品推荐

