2012-08-15 2 views
0

하나의 컬럼에 중복 된 엔트리가있는 테이블의 모든 엔트리에 대한 리포트를 만들고 싶다. 이제 우리는이 같은 테이블을 가정 해 봅시다 :mysql은 중복을 찾을 때 모든 레코드를 얻는다.

customer_name  | some_number 
Tom     1 
Steve    3 
Chris    4 
Tim     3 
... 

내가 중복으로 some_number이있는 모든 기록을 보여주고 싶다. 나는 모든 중복 레코드를 표시하려면이 같은 쿼리를 사용하고 있습니다 :

select customer_name, some_number from table where some_number in (select some_number from table group by some_number having count(*) > 1) order by some_number; 

이 작은 테이블에 대해 작동하지만가 실제로 작동하는 데 필요한 하나가 상당히 크다. 30,000 + 행 및 그것은 영원히 복용하고 있습니다! 누군가 이렇게 할 수있는 더 좋은 방법이 있습니까?

감사합니다.

답변

1

이 쿼리를보십시오 :

SELECT t1.* 
FROM (SELECT some_number, COUNT(*) AS nb 
     FROM your_table 
     GROUP BY some_number 
     HAVING nb>1 
    ) t2, your_table t1 
WHERE t1.some_number=t2.some_number 

쿼리는 먼저, 중복 레코드를 찾기 위해 GROUP BY을 사용하는 모든 필드를 검색 할 테이블과 조인.
HAVING이 사용되었으므로 관심있는 레코드 만 반환 한 다음 your_table과 결합하십시오.

쿼리가 빠르도록하려면 테이블에 some_number의 인덱스가 있어야합니다.

+0

이 조금 더 빠르게 작동하는 것 같습니다. –

+1

이 방법을 사용하는 것이 왜 더 빠 른지 설명을 추가했습니다. – Jocelyn

1

성능이 향상 되었습니까? 그것은 some_number 카운트 테이블에 조인 만있는 사람을 포함하는 필터링하는 count> 1.

SELECT t.customer_name, t.some_number 
FROM my_table t 
INNER JOIN (
    SELECT some_number, COUNT(*) AS ct 
    FROM my_table 
    GROUP BY some_number) dup ON t.some_number = dup.some_number 
WHERE dup.ct > 1 
+0

예, 매우 빠르게 작동합니다. –

관련 문제