tutorial - mysql w3schools




MySQL में डुप्लिकेट मान ढूँढना (14)

मेरे पास वर्चर कॉलम वाला एक टेबल है, और मैं उन सभी रिकॉर्ड्स को ढूंढना चाहता हूं जिनमें इस कॉलम में डुप्लिकेट मान हैं। डुप्लीकेट खोजने के लिए मैं सबसे अच्छी क्वेरी क्या उपयोग कर सकता हूं?


एक बहुत देर से योगदान ... यदि यह किसी भी लाइन को कम करने में मदद करता है ... मुझे बैंकिंग ऐप में लेन-देन के मिलान जोड़े (वास्तव में खाता-से-खाते स्थानान्तरण के दोनों तरफ) ढूंढने का काम था, यह पहचानने के लिए कि कौन से प्रत्येक अंतर-खाता-हस्तांतरण लेनदेन के लिए 'से' और 'से' थे, इसलिए हम इसके साथ समाप्त हुए:

SELECT 
    LEAST(primaryid, secondaryid) AS transactionid1,
    GREATEST(primaryid, secondaryid) AS transactionid2
FROM (
    SELECT table1.transactionid AS primaryid, 
        table2.transactionid AS secondaryid
    FROM financial_transactions table1
    INNER JOIN financial_transactions table2 
    ON table1.accountid = table2.accountid
    AND table1.transactionid <> table2.transactionid 
    AND table1.transactiondate = table2.transactiondate
    AND table1.sourceref = table2.destinationref
    AND table1.amount = (0 - table2.amount)
) AS DuplicateResultsTable
GROUP BY transactionid1
ORDER BY transactionid1;

नतीजा यह है कि DuplicateResultsTable मिलान वाली पंक्तियों (यानी डुप्लिकेट) लेन-देन प्रदान करता है, लेकिन यह वही लेनदेन आईडी को दूसरी बार एक ही जोड़ी से मेल खाता है, इसलिए बाहरी SELECT पहले लेनदेन आईडी द्वारा समूह के लिए होता है, जो कि यह सुनिश्चित करने के लिए कि LEAST दो लेनदेन के परिणाम हमेशा एक ही क्रम में होते हैं, जो कि पहले से GROUP को सुरक्षित बनाता है, इस प्रकार सभी डुप्लिकेट मैचों को समाप्त कर देता है। लगभग दस लाख रिकॉर्ड के माध्यम से दौड़ें और 12 सेकंड के मैचों की पहचान केवल 2 सेकंड में करें। बेशक लेनदेन प्राथमिक सूचकांक है, जिसने वास्तव में मदद की।


एकाधिक फ़ील्ड के साथ डुप्लिकेट पंक्तियों को हटाने के लिए, पहले उन्हें केवल नई पंक्तियों के लिए निर्दिष्ट नई अनूठी कुंजी पर ले जाएं, फिर उसी नई अद्वितीय कुंजी के साथ डुप्लिकेट पंक्तियों को हटाने के लिए "समूह द्वारा" कमांड का उपयोग करें:

Create TEMPORARY table tmp select concat(f1,f2) as cfs,t1.* from mytable as t1;
Create index x_tmp_cfs on tmp(cfs);
Create table unduptable select f1,f2,... from tmp group by cfs;

मान लें कि आपकी तालिका को टेबलएबीसी नाम दिया गया है और जो कॉलम आप चाहते हैं वह है कर्नल और टी 1 की प्राथमिक कुंजी कुंजी है।

SELECT a.Key, b.Key, a.Col 
FROM TableABC a, TableABC b
WHERE a.Col = b.Col 
AND a.Key <> b.Key

उपर्युक्त उत्तर पर इस दृष्टिकोण का लाभ यह कुंजी देता है।


मुझे कोई जॉइन अप्राचिक नहीं दिख रहा है, जिनके पास डुप्लिकेट के मामले में कई प्रयोग हैं।

यह aproeach आपको वास्तविक दोगुनी परिणाम देता है।

SELECT t1.* FROM table as t1 LEFT JOIN table as t2 ON t1.name=t2.name and t1.id!=t2.id WHERE t2.id IS NOT NULL ORDER BY t1.name

मैंने उपर्युक्त परिणाम देखा और क्वेरी ठीक काम करेगी यदि आपको एकल कॉलम मान की जांच करने की आवश्यकता है जो डुप्लिकेट है। उदाहरण के लिए ईमेल।

लेकिन अगर आपको अधिक कॉलम की जांच करने की आवश्यकता है और परिणाम के संयोजन की जांच करना चाहते हैं तो यह क्वेरी ठीक काम करेगी:

SELECT COUNT(CONCAT(name,email)) AS tot,
       name,
       email
FROM users
GROUP BY CONCAT(name,email)
HAVING tot>1 (This query will SHOW the USER list which ARE greater THAN 1
              AND also COUNT)

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

SELECT GROUP_CONCAT(id), name, COUNT(*) c FROM documents GROUP BY name HAVING c > 1;

@ Maxyfc के उत्तर को आगे लेते हुए, मुझे उन सभी पंक्तियों को ढूंढना आवश्यक था जो डुप्लिकेट मानों के साथ लौटाए गए थे, इसलिए मैं उन्हें MySQL वर्कबेंच में संपादित कर सकता था:

SELECT * FROM table
   WHERE field IN (
     SELECT field FROM table GROUP BY field HAVING count(*) > 1
   ) ORDER BY field

GROUP BY साथ एक SELECT । आइए मान लें कि नाम वह कॉलम है जिसमें आप डुप्लिकेट ढूंढना चाहते हैं:

SELECT name, COUNT(*) c FROM table GROUP BY name HAVING c > 1;

यह पहले कॉलम में नाम मान के साथ परिणाम लौटाएगा, और यह गणना होगी कि उस मान में कितनी बार मूल्य दिखाई देता है।


SELECT 
    t.*,
    (SELECT COUNT(*) FROM city AS tt WHERE tt.name=t.name) AS count 
FROM `city` AS t 
WHERE 
    (SELECT count(*) FROM city AS tt WHERE tt.name=t.name) > 1 ORDER BY count DESC

SELECT  *
FROM    mytable mto
WHERE   EXISTS
        (
        SELECT  1
        FROM    mytable mti
        WHERE   mti.varchar_column = mto.varchar_column
        LIMIT 1, 1
        )

यह क्वेरी केवल पूर्ण varchar_column नहीं, पूर्ण रिकॉर्ड देता है।

यह क्वेरी COUNT(*) उपयोग नहीं करती है। यदि बहुत सारे डुप्लिकेट हैं, तो COUNT(*) महंगा है, और आपको पूरे COUNT(*) आवश्यकता नहीं है, आपको केवल यह जानने की आवश्यकता है कि समान मूल्य वाली दो पंक्तियां हैं या नहीं।

varchar_column पर एक सूचकांक होने के varchar_column , इस क्वेरी को बहुत तेज करें।


SELECT ColumnA, COUNT( * )
FROM Table
GROUP BY ColumnA
HAVING COUNT( * ) > 1

SELECT DISTINCT a.email FROM `users` a LEFT JOIN `users` b ON a.email = b.email WHERE a.id != b.id;

SELECT t.*,(select count(*) from city as tt
  where tt.name=t.name) as count
  FROM `city` as t
  where (
     select count(*) from city as tt
     where tt.name=t.name
  ) > 1 order by count desc

शहर को अपनी टेबल से बदलें। नाम को अपने फ़ील्ड नाम से बदलें


SELECT varchar_col
FROM table
GROUP BY varchar_col
HAVING count(*) > 1;




mysql