如何在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
相关产品推荐
相关产品推荐

