[MySQL] 중복 제거에 조건

테이블

Person

id email
1 john@example.com
2 bob@example.com
3 john@example.com

문제

  • 중복된 이메일은 제거 하되 id가 가장 낮은 튜플을 남게 하라

-- 추천
DELETE p1 
FROM Person p1, Person p2
WHERE p1.Email = p2.Email AND p1.Id > p2.Id
;

-- 내가 푼 방법
-- DELETE 하려는 테이블과 같은 테이블을 SELECT에 사용한다면 한 번 더 감싸야 한다
DELETE 
FROM Person p1
WHERE p1.id NOT IN (
    SELECT *
    FROM 
    (
        SELECT MIN(p2.id) AS id
        FROM Person p2
        GROUP BY p2.email 
    ) t1
)
;

스키마

Create table If Not Exists Person (Id int, Email varchar(255));
Truncate table Person;
insert into Person (id, email) values (1, 'john@example.com');
insert into Person (id, email) values (2, 'bob@example.com');
insert into Person (id, email) values (3, 'john@example.com');

links

social