[mysql] MySQL에서 중복 값 찾기

varchar 열이있는 테이블이 있으며이 열에 중복 값이있는 모든 레코드를 찾고 싶습니다. 중복을 찾기 위해 사용할 수있는 가장 좋은 쿼리는 무엇입니까?



답변

를 수행 SELECT로모그래퍼 GROUP BY절. name 이 중복을 찾으려는 열 이라고 가정 해 봅시다 .

SELECT name, COUNT(*) c FROM table GROUP BY name HAVING c > 1;

첫 번째 열에 이름 값 이있는 결과와 두 번째 값에 해당 값이 몇 번 나타나는지를 반환합니다 .


답변

SELECT varchar_col
FROM table
GROUP BY varchar_col
HAVING COUNT(*) > 1;


답변

SELECT  *
FROM    mytable mto
WHERE   EXISTS
        (
        SELECT  1
        FROM    mytable mti
        WHERE   mti.varchar_column = mto.varchar_column
        LIMIT 1, 1
        )

이 쿼리는 distinct뿐만 아니라 완전한 레코드를 반환합니다 varchar_column.

이 검색어는을 사용하지 않습니다 COUNT(*). 중복이 많고 COUNT(*)비싸고 전체가 필요하지 않은 COUNT(*)경우 동일한 값을 가진 두 개의 행이 있는지 알아야합니다.

varchar_column물론 인덱스를 사용 하면이 쿼리 속도가 크게 향상됩니다.


답변

GROUP_CONCAT서버가 지원 하는 경우 중복 행의 ID를 얻기 위해 levik의 답변을 토대로 쉼표로 구분 된 ID 목록을 반환합니다.

SELECT GROUP_CONCAT(id), name, COUNT(*) c FROM documents GROUP BY name HAVING c > 1;


답변

테이블 이름이 TableABC이고 원하는 열이 Col이고 T1의 기본 키가 Key라고 가정합니다.

SELECT a.Key, b.Key, a.Col
FROM TableABC a, TableABC b
WHERE a.Col = b.Col
AND a.Key <> b.Key

위의 답변에 비해이 방법의 장점은 키를 제공한다는 것입니다.


답변

SELECT *
FROM `dps`
WHERE pid IN (SELECT pid FROM `dps` GROUP BY pid HAVING COUNT(pid)>1)


답변

Employee의 이름 열에 중복 된 레코드 수를 찾으려면 아래 쿼리가 도움이됩니다.

Select name from employee group by name having count(*)>1;