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

如何在MySQL中合并magazine_buys与magazine_sells表的记录?

解决方法

交叉连接(CROSS JOIN)会生成两张表的笛卡尔积,这就是你遇到重复记录的核心原因。正确的做法是基于name字段做全连接,确保同杂志的记录匹配,同时保留所有无匹配的记录。

由于MySQL不支持直接的FULL OUTER JOIN,可以用LEFT JOIN加UNION的方式模拟:

SELECT 
    COALESCE(b.name, s.name) AS name,
    COALESCE(b.price, s.price1) AS price,
    s.price2,
    COALESCE(b.date, s.pur_date) AS date,
    s.sold_date
FROM magazine_buys b
LEFT JOIN magazine_sells s ON b.name = s.name

UNION

SELECT 
    COALESCE(b.name, s.name) AS name,
    COALESCE(b.price, s.price1) AS price,
    s.price2,
    COALESCE(b.date, s.pur_date) AS date,
    s.sold_date
FROM magazine_sells s
LEFT JOIN magazine_buys b ON s.name = b.name;

代码说明:

  • 第一个LEFT JOIN保留magazine_buys的所有记录,匹配magazine_sells中同name的记录,无匹配时s相关字段显示NULL
  • 第二个LEFT JOIN反向保留magazine_sells的所有记录,匹配magazine_buys中同name的记录
  • UNION自动去除重复的匹配记录(如果用UNION ALL会保留重复,这里用UNION符合需求)
  • COALESCE函数取第一个非NULL值,实现你需要的“无对应值显示NULL”的逻辑

如果同一杂志(name)存在多条购买/销售记录,需要更精确的关联条件(比如结合购买日期和进货日期),可以调整ON子句的条件,比如:

ON b.name = s.name AND b.date = s.pur_date

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:35:04