उन पंक्तियों का चयन करें जहाँ कॉलम में एक से अधिक रिकॉर्ड में समान डेटा हो


28

मेरे पास एक टेबल है जिसमें एक कॉलम है article_title। मान लीजिए कि तालिका का नाम है articles। मुझे उन रिकॉर्ड्स का पता लगाना होगा जहां article_titleडेटा एक से अधिक रिकॉर्ड पर समान है।

यहाँ मुझे क्या मिला है:

select a.* 
from articles a 
where a.article_title = (select article_title 
                         from articles 
                         where article_title = a.article_title 
                         AND a.id <> articles.id)

जवाबों:


35

HAVING एक बेहतरीन एग्रीगेट फिल्टर है। ( http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html ) उदाहरण के लिए, घटना से अधिक के साथ article_tmarks चुनें:

SELECT count(*), article_title
FROM articles
GROUP BY article_title
HAVING COUNT(*) > 1;

सेलेक्ट और ग्रुप बाय क्लॉस में कॉलम जोड़ना आपको कई कॉलम की कंपोजिट कुंजी के आधार पर डुप्लिकेट का पता लगाने की अनुमति देता है।


2
@jkushner: लेकिन MySQL के कार्यान्वयन में quirks (या कुछ के रूप में बग्स इसे देख सकते हैं) से सावधान रहें GROUP BY: mysqlperformanceblog.com/2006/09/06/…
a_horse_with_no_name

4

आपकी समस्या को इस प्रश्न से हल किया जा सकता है:

SELECT *
FROM article
WHERE article_title IN (SELECT *
                        FROM (SELECT article_title
                              FROM article
                              GROUP BY article_title
                              HAVING COUNT(article_title) > 1)
                        AS a);

यह सही उत्तर है क्योंकि यह वास्तव में उन पंक्तियों को लौटाता है जिनकी डुप्लिकेट हैं
etayluz

3

एक तालिका है जिसमें एक स्तंभ है जिसे article_title कहा जाता है। मान लीजिए कि तालिका का नाम लेख है। मुझे उन अभिलेखों का पता लगाने की आवश्यकता है जहां Article_title डेटा एक से अधिक रिकॉर्ड पर समान है।

मेरी तरह ध्वनि आपको भी आईडी की आवश्यकता है article_titleक्योंकि आप डुप्लिकेट के आधार पर रिकॉर्ड ढूंढना चाहते हैं

GROUP BY के साथ बेसिक MIN / MAX (आपको अधिक बार 2 डुप्लिकेट होने पर आईडी की याद आएगी)

SELECT 
  MIN(id) -- for FIFO id's (first id by duplicate)
, MAX(id) -- for LIFO id's (last id by duplicate)
, article_title
, COUNT(*)  
FROM
 articles
WHERE -- Maybe to filter out '' or IS NOT NULL
 article_title != '' AND article_title IS NOT NULL
GROUP BY
 article_title ASC
HAVING
 COUNT(*) >= 2
;

या फिर एलआईएफओ आईडी (डुप्लिकेट द्वारा पुरानी आईडी) के लिए एक सीएसवी उत्पन्न करने के लिए डिनोमिनेशन के लिए वापस जाना जाता है, लेकिन आप यहां सभी आईडी जानते हैं ..

SELECT 
  GROUP_CONCAT(id ORDER BY ASC SEPARATOR ',') -- change to DESC if want the last record first
, article_title
, COUNT(*)  
FROM
 articles
GROUP BY
 article_title ASC
HAVING
 COUNT(*) >= 2
;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.