2013-01-21 16 views
12

Olası Çoğalt:
Find duplicate records in MySQLMySQL Listesini çoğaltır

böyle MySQL bir tablo vardır:

ID name email 
1 john  [email protected] 
2 johnny [email protected] 
3 jim  [email protected] 
4 Michael [email protected] 

nasıl olacak MySQL sorgusu olabilir Böyle bir kopyasını listeleyebilir misin? yinelenen arama

Sonuç:

ID name email   Duplicate 
1 john  [email protected]  2 
2 johnny [email protected]  2 
+3

Bu tam soru zaten yanıtlandı: http://stackoverflow.com/questions/854128/find-duplicate-records-in-mysql –

cevap

25
SELECT a.*, b.totalCount AS Duplicate 
FROM tablename a 
     INNER JOIN 
     (
      SELECT email, COUNT(*) totalCount 
      FROM tableName 
      GROUP BY email 
     ) b ON a.email = b.email 
WHERE b.totalCount >= 2 

iyi performans için, kolona EMail üzerinde INDEX ekleyin.

VEYA

SELECT a.*, b.totalCount AS Duplicate 
FROM tablename a 
     INNER JOIN 
     (
      SELECT email, COUNT(*) totalCount 
      FROM tableName 
      GROUP BY email 
      HAVING COUNT(*) >= 2 
     ) b ON a.email = b.email 
+0

@JW Yanlış bir şey yapıyorum, ya da çok karmaşık bir sorgu yazdınız? Cevabımı gör. – Kamil

+0

@Kamil sorgunuzun sonucu iki kayıt olmalıdır: 'ID 1 ve 2'. –

+0

Sanırım burada ne sorduğumu anlıyorsun. Sadece bir tablo var ve aşağıdaki tablo mySQL sorgusundan kaynaklanıyor, veritabanındaki başka bir tablo değil. – user1995781

0

MySQL forums üzerinde kontrol this post aşağıdaki verir:

SELECT t1.id, t1.name, t1.email FROM t1 INNER JOIN ( 
SELECT colA,colB,COUNT(*) FROM t1 GROUP BY colA,colB HAVING COUNT(*)>1) as t2 
ON t1.email = t2.email; 
1

Kimliği ve adını sahip yaşayabilirsen virgülle ayrılmış listeler, sonra Aşağıdakileri deneyebilirsiniz:

select email, count(*) as numdups, 
     group_concat(id order by id), group_concat(name order by id) 
from t 
group by email 
having count(*) > 1 

Sonuç, ilişkisel bir biçimde olmamasına rağmen bir birleştirme kaydeder.