2011-09-10 13 views
5

मेरे पास दो टेबल हैं:MYSQL: टेबल के बीच diff

  • उत्पाद

  • products_tmp

products_tmp तालिका में कम फ़ील्ड हैं। लेकिन products_tmp में मौजूद सभी फ़ील्ड उत्पादों में हैं।

डेटा के आयात पर मैं products_tmp तालिका को पॉप्युलेट करता हूं और उसके बाद मुझे 3 चीजें करने की आवश्यकता होती है:

  1. products_tmp में नए उत्पादों की जांच करें जो उत्पादों में नहीं हैं (आईडी प्राप्त करें) (DONE)

  2. उन उत्पादों में पुराने उत्पादों की जांच करें जो products_tmp में नहीं हैं (बाद में हटाने के लिए आईडी प्राप्त करें) (DONE)

  3. बाकी पर मतभेदों की जांच करें। दोनों तालिकाओं में एक उत्पाद-हैश अद्वितीय पहचानकर्ता है।

और मुझे फ़ील्ड title, text, price, photos और category_id में अंतर की जांच करने की आवश्यकता है। और tmp आईडी प्राप्त करना, इसलिए मैं नए मानों के साथ उत्पाद तालिका को अद्यतन कर सकता हूं।

क्या यह केवल mysql में diff करना संभव है?

+0

मेरी अज्ञानता क्षमा करें, मैं आपको काफी नहीं मिला। आप पहले से ही diff (चरण 1 और 2) की तुलना करते हैं, जो आपको तीसरे चरण से रोकने से रोकता है? – ajreal

+0

उदाहरण के लिए, 'products_tmp' में उन उत्पादों में से एक के लिए मूल्य परिवर्तन होता है जो पहले से ही' उत्पादों 'में मौजूद हैं, वह उन परिवर्तनों की पहचान करने में सक्षम होना चाहता है। –

उत्तर

5
  1. जांच products_tmp में नए उत्पादों है कि उत्पादों में नहीं हैं (आईडी प्राप्त) (किया)

यह सीधे आगे है ...

SELECT pt.* 
FROM products_tmp pt 
LEFT JOIN products p ON p.product_id = pt.product_id 
WHERE p.product_id IS NULL; 
  1. जांच पुराने उत्पादों उन उत्पादों में जो product_tmp में नहीं हैं (बाद में हटाने के लिए आईडी प्राप्त करें) (किया गया)

एक हमेशा 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.check। दोनों तालिकाओं में एक उत्पाद-हैश अद्वितीय पहचानकर्ता है।

यह एक एक छोटे से अधिक कठिन है। मान लें कि आप एक क्षेत्र द्वारा क्षेत्र तुलना नहीं करना चाहते हैं, आप ऐसा कर सकता है ...

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

ठंडा, इसे बाहर निकाल देगा ... लेकिन यह समस्या नहीं होगी कि उत्पाद तालिका में tmp से 3 और फ़ील्ड हैं? –

+0

यह मेरा वास्तविक क्वेरी है: चयन product_hash, गिनती (*) cnt से ( चयन p.product_hash, p.price, p.title z_imports_products पी से यूनिअन चयन pt.product_hash, pt.price, pt .title z_imports_products_tmp pt ) से product_hash द्वारा ग्रुप पीडी होने cnt> 1; ' और मैं कोई परिणाम नहीं मिलता है, लेकिन मैं अलग शीर्षक के साथ कम से कम एक पंक्ति है! –

+0

खरोंच कि ... एनवीएम ... एक गलती की ... यह वास्तव में बहुत अच्छी तरह से काम कर रहा है !!! आपके समय और तेज़ उत्तर के लिए धन्यवाद! –

संबंधित मुद्दे