2016-07-07 4 views
0

많은 중복 행이있는 MySQL 테이블이 있습니다. ID를 찾고 삭제하는 방법에 대해 어떻게 할 수 있습니까? 첫 번째 lead_id를두고 다른 중복을 삭제해야합니다.다른 ID를 가진 MySQL 중복 행

그래서이 샘플에서는 중복 된 전자 메일 값을 찾아 모든 행을 삭제해야합니다. IE. 40944의 lead_id 모든 행을 삭제하고 계속 모두 내가 시도했던 40943.

id  | lead_id  | form |field_number | value 
--------+---------------+-------+---------------+---------------------- 
537618 | 40943  |1  | 3.3   | Mike 
537622 | 40943  |1  | 4.3   | Mesa 
537623 | 40943  |1  | 4.4   | AZ 
537624 | 40943  |1  | 4.5   | 85210 
537625 | 40943  |1  | 4.6   | United States 
537626 | 40943  |1  | 5    | [email protected] 
537627 | 40943  |1  | 6    | (555) 555-5555 
537628 | 40943  |1  | 19   | JM-SL-I4CLR,JM-FM-I5CLR 
537629 | 40943  |1  | 12   | 2015-10-01 
547618 | 40944  |1  | 3.3   | Mike 
547622 | 40944  |1  | 4.3   | Mesa 
547623 | 40944  |1  | 4.4   | AZ 
547624 | 40944  |1  | 4.5   | 85210 
547625 | 40944  |1  | 4.6   | United States 
547626 | 40944  |1  | 5    | [email protected] 
547627 | 40944  |1  | 6    | (555) 555-5555 
547628 | 40944  |1  | 19   | JM-SL-I4CLR,JM-FM-I5CLR 
547629 | 40944  |1  | 12   | 2015-10-01 

:

SELECT `value`, count(*) 
FROM `lead_detail` 
WHERE `field_number` = 5 
GROUP BY `value` 
HAVING count(*) > 1 

그냥하지 않도록 행을 삭제하는 방법을

value   | count(*) 
---------------+------------------ 
[email protected] | 2 

결과?

답변

0

중복 된 이메일을 찾고 있으므로 필요하지 않을 것입니다. 그러나 이후 리드가 초기 리드보다 세부 사항을 가지고있을 때 어떻게됩니까? 이 쿼리는 모든 필드가 중복 된 경우에만 삭제하려는 경우 참조 용입니다.

DELETE FROM lead_detail 
WHERE lead_id in 
    (SELECT * FROM (SELECT lead_id FROM 
        (SELECT lead_id, 
          GROUP_CONCAT(form ORDER BY form,field_number)as forms, 
          GROUP_CONCAT(field_number ORDER BY form,field_number) as field_numbers, 
          GROUP_CONCAT(value ORDER BY form,field_number) as `values` 
        FROM lead_detail 
        GROUP BY lead_id)l1 
    WHERE EXISTS (SELECT 1 FROM 
       (SELECT lead_id, 
          GROUP_CONCAT(form ORDER BY form,field_number)as forms, 
          GROUP_CONCAT(field_number ORDER BY form,field_number) as field_numbers, 
          GROUP_CONCAT(value ORDER BY form,field_number) as `values` 
        FROM lead_detail 
        GROUP BY lead_id)l2 
       WHERE l2.lead_id < l1.lead_id 
       AND l2.forms = l1.forms 
       AND l2.field_numbers = l1.field_numbers 
       AND l2.`values` = l1.`values`) 
    )T 
    ) 
2

이와 비슷한 방법으로 간단히 수행 할 수 있습니다. 나 자신에 의해 이것을 사용하고 작업이 성공적으로 완료 가지고 ..

DELETE t1 FROM lead_detail t1, lead_detail t2 
WHERE t1.id > t2.id AND t1.field_number = t2.field_number 

을 그리고 또한 확장 무료 한/필요에 따라 부분 (만 필요한 경우) 위치를 변경합니다.

1

삭제하려는 lead_id를 반환해야합니다. 먼저 임시 테이블에 결과를 저장하고 쿼리를 실행하여 실행 결과를 잃지 않도록하십시오. 이 레코드가

select distinct(l1.lead_id) 
from lead_detail l1 
inner join lead_detail l2 on l1.value = l2.value AND l1.field_number = 5 AND l2.field_number = 5 AND l1.id != l2.id LIMIT 
18446744073709551610 OFFSET 1 

18,446,744,073709551610 때문에 첫 번째를 건너 뛰고 오프셋이 Can't do offset without limit

이다 (중복 리드 테이블에 연속 입력이되지 않습니다) 혼합 된 경우에도 작동합니다 (당신이 하나 개의 기록을 유지 만들려면)

Delete from lead_detail where lead_id in (above query) 

를 수행 한 후 다시 확인 결과

관련 문제