MySQL中匹配2014年购买同款产品的客户对的SQL查询问题
问题分析与解决方案
你的原SQL存在核心逻辑错误:o.cid=c1.cid=c2.cid这种写法不会关联两个购买同款产品的客户,而是要求订单的cid同时等于c1和c2的cid——这意味着c1和c2必须是同一个客户,但你又加了c1.cid!=c2.cid的条件,逻辑完全矛盾,导致结果异常。
正确SQL写法
要找出2014年购买同款产品的客户对,正确思路是先通过订单表自连匹配同产品的不同客户,再关联客户表、产品表获取名称:
SELECT c1.cname AS c1name, c2.cname AS c2name, p.pname FROM orders o1 JOIN orders o2 ON o1.pid = o2.pid AND o1.cid != o2.cid AND YEAR(o1.odate) = 2014 AND YEAR(o2.odate) = 2014 JOIN customers c1 ON o1.cid = c1.cid JOIN customers c2 ON o2.cid = c2.cid JOIN products p ON o1.pid = p.pid -- 若需保留双向客户对(如同时显示Gupta-Jones和Jones-Gupta),删除下方WHERE条件即可 WHERE c1.cname < c2.cname ORDER BY p.pname, c1.cname, c2.cname;
逻辑说明
- 订单自连:通过
o1.pid = o2.pid锁定同款产品,o1.cid != o2.cid确保是不同客户,同时限定两个订单的年份均为2014。 - 关联客户表:分别用两个订单的cid关联客户表实例,获取两个客户的名称。
- 关联产品表:通过订单的pid关联产品表,获取对应产品名称。
- 客户名排序控制:
c1.cname < c2.cname可避免重复客户对(如避免同时出现Jones-Smith和Smith-Jones),如果需要和你给出的预期结果完全匹配(保留双向对),直接删除该WHERE条件即可。
内容的提问来源于stack exchange,提问作者JESmith
相关产品推荐
相关产品推荐

