MySQL에서 하나를 제외한 모든 중복 행을 삭제 하시겠습니까? [복제]
가능한 중복 :
MySQL에서 중복 행 제거
MySQL 테이블에서 모든 중복 데이터를 어떻게 삭제합니까?
예를 들어 다음과 같은 데이터가 있습니다.
SELECT * FROM names;
+----+--------+
| id | name |
+----+--------+
| 1 | google |
| 2 | yahoo |
| 3 | msn |
| 4 | google |
| 5 | google |
| 6 | yahoo |
+----+--------+
쿼리 인 SELECT DISTINCT name FROM names;
경우 사용 SELECT
합니다.
어떻게이 함께 할 것입니다 DELETE
만 제거 중복에 각각의 하나 개의 기록을 유지?
편집기 경고 :이 솔루션은 계산이 비효율적이며 큰 테이블에 대한 연결이 끊어 질 수 있습니다.
NB - 당신은 필요 에 처음이 작업을 수행하는 테스트 사본 테이블의!
내가 그것을했을 때 나는 또한 포함하지 않으면 AND n1.id <> n2.id
테이블의 모든 행을 삭제 한다는 것을 알았 습니다.
가장 낮은
id
값으로 행을 유지하려면 다음을 수행하십시오 .DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
행을 가장 높은
id
값 으로 유지하려면 다음을 수행하십시오 .DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name
MySQL 5.1 에서이 방법을 사용했습니다.
다른 버전에 대해서는 확실하지 않습니다.
업데이트 : 중복 제거를위한 인터넷 검색 사람들이 여기에 있기 때문에
OP의 질문에 관한 것이지만 DELETE
사용 INSERT
하고 DISTINCT
훨씬 빠릅니다. 행이 8 백만인 데이터베이스의 경우 아래 쿼리에 13 분이 걸렸지 만을 (를) 사용 DELETE
하는 데 2 시간 이상 걸리지 만 아직 완료되지 않았습니다.
INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
SELECT DISTINCT cellId,attributeId,entityRowId,value
FROM tableName;
가장 낮은 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 오류가 발생합니다.
참고 URL : https://stackoverflow.com/questions/4685173/delete-all-duplicate-rows-except-for-one-in-mysql
'Programming' 카테고리의 다른 글
GCC에서`문자열 상수에서 'char *'`경고로 더 이상 사용되지 않는 변환을 제거하는 방법은 무엇입니까? (0) | 2020.02.21 |
---|---|
Laravel에는 Mcrypt PHP 확장이 필요합니다 (0) | 2020.02.21 |
문자열의 첫 글자를 대문자로 만듭니다 (성능 극대화). (0) | 2020.02.21 |
Android에서 텍스트를 굵게 변경하려면 어떻게합니까? (0) | 2020.02.21 |
Google Gson-역 직렬화 목록 (0) | 2020.02.21 |