SQL查询:获取姓名重复且仅订购过5分水果的客户对
实现思路
你的现有查询存在逻辑漏洞:仅通过WHERE过滤评分5的水果行,无法排除「用户同时买过5分和非5分水果」的情况,不能真正筛选出仅订购过5分水果的用户。正确实现分两步:
- 先过滤出所有仅订购过5分水果的合格客户
- 对合格客户做自关联,匹配同姓名的重复客户,同时通过id大小限制避免重复配对
完整查询语句
WITH qualified_customers AS ( -- 第一步:筛选仅订购过taste_rating=5的水果的客户 SELECT c.id customer_id, c.first_name, c.last_name FROM Customers c INNER JOIN Orders o ON c.id = o.customer_id INNER JOIN Order_Item oi ON o.id = oi.order_id INNER JOIN Fruits f ON oi.fruit_id = f.id GROUP BY c.id, c.first_name, c.last_name -- 核心判断:该客户所有订购的水果没有出现过非5分的评分 HAVING SUM(CASE WHEN f.taste_rating != 5 THEN 1 ELSE 0 END) = 0 ) -- 第二步:匹配同姓名的重复客户 SELECT q1.customer_id u1_id, q2.customer_id u2_id, q1.first_name, q1.last_name FROM qualified_customers q1 INNER JOIN qualified_customers q2 ON q1.first_name = q2.first_name AND q1.last_name = q2.last_name AND q1.customer_id < q2.customer_id
逻辑说明
- 子查询
qualified_customers里通过分组聚合判断每个客户的所有订单水果评分是否全为5,彻底排除不符合要求的客户 - 自关联时加
q1.customer_id < q2.customer_id的条件,是为了避免同一对客户重复出现(比如不会同时输出(1,4)和(4,1)两条相同配对的记录) - 最终输出结果和你给出的示例完全匹配
内容的提问来源于stack exchange,提问作者user13914470
相关产品推荐
相关产品推荐

