2013-01-21 11 views
12

Powiel możliwe:
Find duplicate records in MySQLMySQL Lista Wszystkie kopie

Mam tabeli w MySQL tak:

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

Jak mogę mieć kwerendę MySQL, które będą wymień duplikat takiego?

Wynik duplikatu wyszukiwania:

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

To dokładne pytanie zostało już odebrane: http://stackoverflow.com/questions/854128/find-duplicate-records-in-mysql –

Odpowiedz

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 

dla lepszej wydajności, dodać INDEX na kolumnie EMail.

LUB

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 czy robię coś nie tak, czy napisałeś zbyt skomplikowane zapytanie? Zobacz moją odpowiedź. – Kamil

+0

@Kamil Wynik zapytania musi mieć dwa rekordy: 'ID 1 i 2'. –

+0

Chyba brakuje ci zrozumienia tego, o co tutaj pytam. Jest tylko jedna tabela, a poniższa tabela jest wynikiem zapytania mySQL, a nie kolejnej tabeli w bazie danych. – user1995781

0

Sprawdź this post na MySQL forums, co daje następujące:

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

Jeśli można żyć z posiadania identyfikatora i nazwy oddzielone przecinkami listy możesz spróbować:

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 

To zapisuje sprzężenie, chociaż wynik nie jest w formacie relacyjnym.

Powiązane problemy