Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

केवल सबसे पुरानी पंक्ति को छोड़कर डुप्लीकेट पंक्तियाँ निकालें?

चूंकि आप आईडी कॉलम का उपयोग इस बात के संकेतक के रूप में कर रहे हैं कि कौन सा रिकॉर्ड 'मूल' है:

delete x 
from myTable x
 join myTable z on x.subscriberEmail = z.subscriberEmail
where x.id > z.id

यह प्रति ईमेल पते पर एक रिकॉर्ड छोड़ देगा।

जोड़ने के लिए संपादित करें:

उपरोक्त प्रश्न की व्याख्या करने के लिए...

यहां विचार अपने खिलाफ तालिका में शामिल होने का है। मान लीजिए कि आपके पास तालिका की दो प्रतियां हैं, प्रत्येक ने कुछ अलग नाम दिया है। फिर आप उनकी एक दूसरे से तुलना कर सकते हैं, और निम्नतम आईडी या प्रत्येक ईमेल पते के लिए खोज सकते हैं। फिर आप डुप्लिकेट रिकॉर्ड देखेंगे जो बाद में बनाए गए थे और उन्हें हटा सकते थे। (इस बारे में सोचते समय मैं एक्सेल की कल्पना कर रहा था।)

उस ऑपरेशन को एक टेबल पर करने के लिए, इसकी तुलना खुद से करें और प्रत्येक पक्ष की पहचान करने में सक्षम होने के लिए, आप टेबल उपनाम का उपयोग करते हैं। x एक टेबल उपनाम है। इसे from . में असाइन किया गया है इस तरह का खंड:from <table> <alias> से . x उस तालिका को शॉर्टकट के रूप में संदर्भित करने के लिए अब उसी क्वेरी में कहीं और उपयोग किया जा सकता है।

delete x हमारी कार्रवाई और लक्ष्य के साथ क्वेरी शुरू करता है। हम एकाधिक तालिकाओं से रिकॉर्ड का चयन करने के लिए एक क्वेरी करने जा रहे हैं, और हम x में दिखाई देने वाले रिकॉर्ड को हटाना चाहते हैं ।

उपनाम का उपयोग तालिका के दोनों 'उदाहरणों' को संदर्भित करने के लिए किया जाता है। from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail पर myTable z से जुड़ें जहां ईमेल मेल खाते हैं, वहां टेबल को अपने आप ऊपर कर देता है। इसके बाद आने वाले खंड के बिना, प्रत्येक रिकॉर्ड का चयन किया जाएगा क्योंकि इसे स्वयं के विरुद्ध जोड़ा जा सकता है।

where क्लॉज चुने गए रिकॉर्ड को सीमित करता है। where x.id > z.id 'उदाहरण' को x के उपनाम से अनुमति देता है केवल वे रिकॉर्ड शामिल करने के लिए जो ईमेल से मेल खाते हैं लेकिन उच्च id . हैं मूल्य। तालिका में जो डेटा आप वास्तव में चाहते हैं, अद्वितीय ईमेल पते (निम्नतम आईडी के साथ) x का हिस्सा नहीं होंगे और हटाया नहीं जाएगा। x . में एकमात्र रिकॉर्ड डुप्लीकेट रिकॉर्ड (ईमेल पते) होंगे जिनमें उच्च id होगा उस ईमेल पते के मूल रिकॉर्ड की तुलना में।

इस मामले में शामिल हों और जहां क्लॉज को जोड़ा जा सकता है:

delete x 
  from myTable x 
  join myTable z
    on x.subscriberEmail = z.subscriberEmail
      and x.id > z.id

डुप्लिकेट को रोकने के लिए, सब्सक्राइबर ईमेल कॉलम को एक अद्वितीय अनुक्रमित कॉलम बनाने पर विचार करें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. जहां_इन और find_in_set . के बीच अंतर

  2. एक ही डेटाबेस में एकाधिक MySQL तालिकाओं को मैप करने के लिए कॉन्फ़िगरेशन फ़ाइल (.cfg.xml) को हाइबरनेट करें?

  3. चेतावनी:mysqli ::mysqli ():(HY000/1045):उपयोगकर्ता 'डेटाबेस' @ 'लोकलहोस्ट' (पासवर्ड का उपयोग करके:नहीं) के लिए प्रवेश निषेध

  4. एकाधिक रूप और एक प्रसंस्करण पृष्ठ

  5. एकाधिक छोटे प्रश्न बनाम एक लंबी क्वेरी। कौन सा अधिक कुशल है?