Friday, 15 May 2015

The best way to join two dissimilar mySQL tables -- planning for django from python -


  तालिका a (t_a): आईडी नाम पिछले सबसे पहले ईमेल राज्य देश 0 sklass klass steve sklass@foo.com में ब्रिटेन 1 jabid आबिद जॉन abid@foo.com ny हमें 2 jcolle Colle जॉन jcolle@foo.com हमें वाई तालिका ख (t_b): आईडी एस.एन. ब्रिटेन 1 जॉन आबिद में दिए गए निक ईमेल नियंत्रण रेखा 0 स्टीवन क्लास स्टीव sklass@foo.com - abid_j@foo.com ny हमें 2 जॉनी कोल जॉन jcolle@foo.com वाई हमें 3 जॉन आबिद - abid@foo.com ny हमें  

क्या ऊपर सूचीबद्ध है है एक (संक्षिप्त) स्तंभ और पंक्ति mySQL टेबल दो तालिकाओं को देखते हुए यह स्पष्ट हो जाता है कि मूल्यों को सख्ती से देखकर (आईडी नहीं देखा गया है) और उन मूल्यों की मेलिंग संख्या की तुलना करें जिन्हें आप इन मूल्यों के मेल प्राप्त करेंगे।

  t_a t_b 0 0 1 3 2 2 - 1  

मैं आखिरकार क्या करने की कोशिश कर रहा हूं, ऐसा करने के लिए डीजेंगो में है - मुझे यकीन नहीं है कि अगर यह मामला है अतीत में मैंने यह शुद्ध अजगर का उपयोग करके किया है जिसमें मैं पुराने डेटा को नष्ट करता हूं और सिर्फ तीन नए टेबल बना देता हूं मैं अपने कार्यान्वयन से नीचे बदलाव करना चाहता हूं (नीचे सूचीबद्ध) क्योंकि जो समस्याएं मैं देख रहा हूं वह समय बदलता है और लोग आते हैं और जाते हैं अतीत में मैंने अभी डेटा को पुन: उत्पन्न किया है - लेकिन अब जब मैं लोगों को छोड़ देता हूं और केवल डेटा को प्रतिस्थापित नहीं करता (हटाएं) का ट्रैक रखना चाहता हूं। मेरा मानना ​​है कि एक एसक्यूएल अद्यतन करके और अधिक सुरुचिपूर्ण है और इतिहास को सुरक्षित रखता है।

मैं जानना चाहता हूं कि इस मर्ज किए गए उत्तर को सीधे mySQL से (या तो एक एसक्यूएल फ़ंक्शन या एक नई तालिका का निर्माण) जो निम्न तरीके से डेटा में विलीन हो। मैं यह शुद्ध एसक्यूएल का उपयोग करना चाहता हूँ (मुझे विश्वास है कि मैं यह Django में कर सकता हूँ)। इसलिए मैं एक ऐसे समाधान की तलाश कर रहा हूं जो निम्न मानदंडों को पूरा करता है:

  1. एक न्यूनतम_मैच है जो कि दोनों पंक्तियों के बीच की न्यूनतम संख्या को परिभाषित करता है जिसमें से गठबंधन होना चाहिए मान्य है।
  2. जबकि तालिकाओं में भिन्न लंबाई हो सकती है, यह 1-ते-1 मानचित्रण है दूसरे शब्दों में बहुत से एक हो सकता है (अभी तक)

अब मेरी पृष्ठभूमि अजगर है और मेरे लिए यह करने का सबसे आसान तरीका हमेशा से कम से कम लूप के लिए करना है दो तालिकाओं, जो फिर से अन्य टेबल पर लूप के लिए करता है जो मैचों की संख्या को देखता है। कोड में ऐसा लगता है

  t_a = [["sklass", "klass", "steve", "sklass@foo.com", "में", "uk",], ["jabid", " आबिद "," जॉन "," abid@foo.com "," एनवाई "," हमें ",], [" jcolle "," Colle "," जॉन "," jcolle@foo.com "," वाई ", "हम",],] ["स्टीवन", "क्लेश", "स्टीव", "स्क्लाज़ @ फ़ू डॉट कॉम", "इन", "ब्रिटेन",], ["जॉन", "अबिद" "एबीआईडी_ज@फ़ू डॉट कॉम", "एनवाई", "यू",], ["जॉनी", "कॉलीन", "जॉय", "जेकॉलले @ एफू डॉट", "वाई", "यू"), [ "जॉन", "आबिद", "abid@foo.com", "एनवाई", "हमें",],] min_match = 3 में t_a person_a के लिए: के लिए मैच = 0 match_pct = 0.0 match_a_index = t_a.index (person_a) Person_b में t_b: new_match_count = len (सूची (सेट (person_a) & amp; सेट (person_b))) अगर new_match_count & gt; मैच: से मेल = new_match_count match_b_index = t_b.index (person_b) match_pct = "% .2f"% (नाव (new_match_count) / \ नाव (लेन (सेट (person_a + person_b))) * 100) अगर मैच & gt; = min_match: प्रिंट match_a_index, match_b_index #, match_pct, मैच  

टिप्पणी सवाल पूछते हैं कि आप सिर्फ ईमेल पते पर क्यों नहीं जुड़ते हैं मुझे यह जरूरी नहीं पता है कि कॉलम के मान मैच होंगे। मैं हूँ निश्चित है कि t_a में दिए गए पंक्ति से मान t_b में एक पंक्ति के लिए मानों का मिलान करेंगे मैं टी_ए में टी_ए में एक पंक्ति के लिए सबसे अधिक (सबसे संभावित) मैच चाहता हूं और केवल अगर मैचों की संख्या min_match से अधिक है।

आप एक कर्सर एक संग्रहीत प्रक्रिया के माध्यम से निष्पादित के माध्यम से सीधे MySQL में ऐसा कर सकते हैं।

  परिसीमक $$ प्रक्रिया बनाएं `proc_name` () शुरू घोषित किया INT डिफ़ॉल्ट 0 ; DECLARE एआईआईडी BIGINT UNSIGNED; DECLARE b_id BIGINT UNSIGNED; DECLARE x_count INT; - निम्नलिखित t_a.id के लिए निम्नलिखित कर्सर cur1 कर्सर की तरह कुछ, t_b से T_b.id, t_b WHERE t_a.email = t_b.email; DECLARE सेट नहीं मिला के लिए HANDLER CONTINUE CONTINUE = 1; चयन संख्या (*) में x_ गणित से t_a, t_b WHERE t_a.email = t_b.email; यदि (x_count & gt; & lt; some_min_value & gt;) फिर से cur1; एक_आईडी, बी_आईडी में फिर से छूटे फेट करें; अगर नहीं तो - कुछ अद्यतन पंक्तियों की तरह यहां कुछ करें, पंक्तियाँ निकालें, आदि। - ए_आईडी और बी_आईड दो तालिकाओं के लिए दो आईडी मानों को पकड़ते हैं - जो प्राथमिक कुंजी के अंत में आती है IF; जब तक खत्म हो चुका है; बंद करो 1; अगर अंत; END $ $  

No comments:

Post a Comment