You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

逻辑说明

  1. 订单自连:通过o1.pid = o2.pid锁定同款产品,o1.cid != o2.cid确保是不同客户,同时限定两个订单的年份均为2014。
  2. 关联客户表:分别用两个订单的cid关联客户表实例,获取两个客户的名称。
  3. 关联产品表:通过订单的pid关联产品表,获取对应产品名称。
  4. 客户名排序控制:c1.cname < c2.cname可避免重复客户对(如避免同时出现Jones-Smith和Smith-Jones),如果需要和你给出的预期结果完全匹配(保留双向对),直接删除该WHERE条件即可。

内容的提问来源于stack exchange,提问作者JESmith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:25:39