MYSQL:两个表之间的区别

5
我有两个表:
  • 产品

  • 产品_tmp

products_tmp 表的字段比较少。但是,products_tmp 中所有的字段也都在产品表中。

导入数据时,我会填充 products_tmp 表,然后需要做三件事:

  1. 检查不在产品中的 products_tmp 中的新产品 (获取 IDs) (已完成)

  2. 检查产品中不在 products_tmp 中的旧产品 (获取用于以后删除的 IDs) (已完成)

  3. 检查其余部分的差异。两张表都有唯一的产品哈希标识符。

我需要检查字段 title, text, price, photoscategory_id 的差异。并获取临时 ID,以便稍后可以使用新值更新产品表。

是否可能只在 MySQL 中进行 Diff?


请原谅我的无知,我不太明白你的意思。你已经比较了差异(步骤1和2),那么第三步有什么阻碍呢? - ajreal
例如,如果products_tmp包含已经存在于products中的某个产品的价格变化,他希望能够识别这些变化。 - Doug Kress
1个回答

6
  1. 检查在products_tmp中但不在products中的新产品(获取id)(已完成)

这很简单...

SELECT pt.*
FROM products_tmp pt
LEFT JOIN products p ON p.product_id = pt.product_id
WHERE p.product_id IS NULL;
  1. 检查旧产品是否不在products_tmp中(获取id以备后续删除)(已完成)

我个人更喜欢交换表格而不是执行RIGHT JOINS操作 - 这是个人偏好...

SELECT p.*
FROM products p
LEFT JOIN products_tmp pt ON p.product_id = pt.product_id
WHERE pt.product_id IS NULL;

3. 检查其余部分的差异。两个表都有产品哈希唯一标识符。

这个比较困难。假设您不想逐个字段进行比较,您可以这样做...

SELECT product_id, count(*) cnt
FROM (
    SELECT p.product_id, p.field2, p.field3
    FROM products p
    UNION
    SELECT pt.product_id, pt.field2, pt.field3
    FROM products_tmp pt
) pd
GROUP BY product_id
HAVING cnt > 1;
< p > UNION 应该自然地将重复的行合并为一行,因此基于您的主键计数为2的任何内容都应该是重复行。如果将此结果放入临时表中,您可以执行更多查询以查看差异。


很酷,我会去看看...但问题不是产品表比tmp多了3个字段吗? - DS_web_developer
这是我的实际查询:SELECT product_hash, count(*) cnt FROM ( SELECT p.product_hash, p.price, p.title FROM z_imports_products p UNION SELECT pt.product_hash, pt.price, pt.title FROM z_imports_products_tmp pt ) pd GROUP BY product_hash HAVING cnt > 1;`但我没有得到任何结果,但我至少有一行具有不同的标题! - DS_web_developer
算了,不用管了...我犯了个错误...它实际上运行得非常好!!!感谢您的时间和快速响应! - DS_web_developer
您需要列出两个SELECT语句中可能包含您关心的差异的所有字段。如果所选字段存在差异,它将显示出来。 - Doug Kress
@DougKress 现在我该如何获取这些差异数据并适当地更新“产品”表? - Ethan
@Ethan - 我不确定我是否理解你的问题 - 你想进行什么样的更新?如果你想看到差异而不是相似之处,你只需要使用“HAVING cnt = 1”而不是“> 1”。 - Doug Kress

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接