2011-09-10 28 views
5

之間的差異我有兩個表:MYSQL:表

  • 產品

  • products_tmp

products_tmp表有較少的字段。但products_tmp中的所有字段都在產品中。

上的數據導入我填充products_tmp表之後,我需要做3件事情:

  1. 檢查新產品products_tmp不在產品(獲得IDS)(DONE)

  2. 檢查老產品不在products_tmp(獲得後面刪除IDS)產品(DONE)

  3. 檢查對其餘的差異。這兩個表都有一個產品哈希唯一標識符。

,我需要檢查的領域titletextpricephotoscategory_id差異。獲取tmp ID,然後我可以用新值更新產品表。

是否有可能僅在mysql中執行diff?

+0

請原諒我的無知,我不完全明白你的意思。你已經比較了差異(步驟1和2),阻止你做第三步? – ajreal

+0

例如,如果'products_tmp'包含「產品」中已存在的某個產品的價格變化,他希望能夠識別這些變化。 –

回答

5
  1. 檢查新產品products_tmp不在產品(獲得IDS)(DONE)

這是直線前進...

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以供後續刪除)(DONE)

一個總是喜歡換表來執行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什麼基於你的主鍵應該是一個重複的行。如果你把這個結果放到一個臨時表中,你可以做更多的查詢來看看有什麼不同。

+0

酷,會扯出來......但不會是問題產品表有3比tmp更多的字段? –

+0

這是我的實際查詢: 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;' 和我沒有得到任何結果,但我至少有一排用不同的稱號! –

+0

劃傷...... nvm ......犯了一個錯誤......它實際上工作得很好!!! 感謝您的時間和快速響應! –