我有两张桌子:
产品
products_tmp
products_tmp
表的字段较少。但是products_tmp
中的所有字段都在产品中。
在导入数据时,我填充了products_tmp
表,之后我需要做3件事:
检查products_tmp
中不在产品中的新产品(获取ID)(完成)
检查不在products_tmp
的产品中的旧产品(获取以后删除的ID)(完成)
检查其余部分的差异。两个表都有一个产品哈希唯一标识符。
我需要检查字段title
,text
,price
,photos
和category_id
中的差异。获取tmp ID,然后我可以使用新值更新products表。
是否可以仅在mysql中执行diff?
答案 0 :(得分:5)
这是直截了当的......
SELECT pt.*
FROM products_tmp pt
LEFT JOIN products p ON p.product_id = pt.product_id
WHERE p.product_id IS NULL;
总是更喜欢交换表格来执行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;
UNION
自然应该将重复项连接到一行,因此基于主键计数为2的任何内容都应该是重复行。如果将结果放入临时表中,则可以执行更多查询以查看差异。