2013-01-21 2 views
12

가능한 중복 :
Find duplicate records in MySQLMySQL의 목록의 모든 중복

이 같은 MySQL의에서 테이블을 가지고 :

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

가 어떻게 것 MySQL의 쿼리를 할 수 있습니다 이렇게 중복 된 것을 나열하시오. 중복 검색

결과 :

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

이 정확한 질문에 이미 답변되었습니다 : http://stackoverflow.com/questions/854128/find-duplicate-records-in-mysql –

답변

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 

더 나은 성능을 위해, 열 EMail상의 INDEX를 추가합니다.

또는

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 내가 잘못했거나, 너무 복잡한 쿼리를 작성 했습니까? 내 대답을 보라. – Kamil

+0

@ 카밀 질의 결과에는 두 개의 레코드, 즉 'ID 1과 2'가 있어야합니다. –

+0

나는 당신이 내가 여기에서 묻고있는 것을 이해하지 못할 것으로 생각한다. 하나의 테이블 만 있고 아래 테이블은 데이터베이스의 다른 테이블이 아닌 mySQL 쿼리의 결과입니다. – user1995781

0

MySQL forums에 확인 this post는 다음을 제공합니다 :

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

는 ID와 이름을 가지고 살 수있는 경우 쉼표로 구분 된 목록 시도해 볼 수 있습니다 :

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 

이 결과는 관계형 형식이 아니지만 결과를 저장합니다.