복붙노트

[SQL] MySQL은 하나를 제외한 모든 중복 행을 삭제 하시겠습니까? [복제]

SQL

MySQL은 하나를 제외한 모든 중복 행을 삭제 하시겠습니까? [복제]

어떻게 MySQL의 테이블에서 모든 중복 데이터를 삭제할 것인가?

예를 들어, 다음 데이터 :

SELECT * FROM names;

+----+--------+
| id | name   |
+----+--------+
| 1  | google |
| 2  | yahoo  |
| 3  | msn    |
| 4  | google |
| 5  | google |
| 6  | yahoo  |
+----+--------+

나는 이름과 구별 이름을 선택 사용한다; 그것은 SELECT 질의 인 경우.

어떻게에만 중복을 제거하고 각 하나의 기록을 유지하기 위해 DELETE로 이런 짓을 했을까?

해결법

  1. ==============================

    1.NB - 당신은 당신의 테이블의 테스트 사본에 처음이 작업을 수행 할 필요가!

    NB - 당신은 당신의 테이블의 테스트 사본에 처음이 작업을 수행 할 필요가!

    내가 그것을했을 때, 나는 또한 포함하지 않는 n1.id <> n2.id,이 테이블의 모든 행을 삭제 한 것을 발견했다.

    나는 MySQL의 5.1에서이 방법을 사용

    확실하지 다른 버전에 대한.

    업데이트 : 중복을 제거하기 위해 인터넷 검색 사람 때문에 여기까지 영업 이익의 질문 DELETE에 대해이지만, INSERT를 사용하여 DISTINCT하는 것이 훨씬 빠르다는 것을 명심하시기 바랍니다. DELETE 사용하는 동안 800 만 개 행이 데이터베이스의 경우, 아래의 쿼리는 2 시간 이상 걸렸다 아직 완료되지 않은, 13 분이 걸렸다.

    INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
        SELECT DISTINCT cellId,attributeId,entityRowId,value
        FROM tableName;
    
  2. ==============================

    2.당신은 가장 낮은 id 값이있는 행을 유지하려면 :

    당신은 가장 낮은 id 값이있는 행을 유지하려면 :

    DELETE FROM NAMES
     WHERE id NOT IN (SELECT * 
                        FROM (SELECT MIN(n.id)
                                FROM NAMES n
                            GROUP BY n.name) x)
    

    당신이 id 값을 원하는 경우에 그 최고입니다 :

    DELETE FROM NAMES
     WHERE id NOT IN (SELECT * 
                        FROM (SELECT MAX(n.id)
                                FROM NAMES n
                            GROUP BY n.name) x)
    

    하위 쿼리의 하위 쿼리는 MySQL을위한 필요, 또는 당신은 1093 오류가 발생합니다.

  3. from https://stackoverflow.com/questions/4685173/delete-all-duplicate-rows-except-for-one-in-mysql by cc-by-sa and MIT license