2016-07-07 21 views
0

Ich habe eine MySQL-Tabelle mit vielen doppelten Zeilen. Wie kann ich die IDs finden und löschen? Ich muss die erste lead_id lassen und die anderen Duplikate löschen.MySQL doppelte Zeilen mit verschiedenen IDs

Also in diesem Beispiel müsste ich die doppelten E-Mail-Werte finden und alle Zeilen löschen. IE. löschen Sie alle Zeilen mit einem lead_id von 40944 und halten alle die 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 

ich versucht habe:

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

Ergebnisse

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

einfach nicht sicher, wie die Zeilen löschen?

Antwort

0

Sie suchen nur nach doppelten E-Mails, so dass Sie diese wahrscheinlich nicht benötigen. Aber was passiert, wenn später führt mehr Details als die anfängliche führen? Diese Abfrage dient hier nur als Referenz, wenn Sie nur löschen möchten, wenn alle Felder Duplikate sind.

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

Sie können es einfach tun, indem Sie etwas Ähnliches verwenden. Ich habe das von mir verwendet, und bekam die Arbeit erfolgreich getan ..

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

Und auch Sie sind frei, die in dem Teil nach Bedarf zu erweitern/verändern (nur bei Bedarf).

1

Dies sollte die lead_id zurückgeben, die Sie löschen möchten. Ich schlage vor, es zuerst zu laufen, Ergebnis in der temporären Tabelle zu speichern und einige Fragen zu tun, um sicherzustellen, dass Sie nichts verlieren. Dies funktioniert sogar, wenn die Datensätze gemischt werden (Dubletten an den Leitungen Tabelle nicht aufeinanderfolgende Eingänge)

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 

18446744073709551610 ist wegen dieser Can't do offset without limit

die erste Offset überspringt (um sicherzustellen, dass Sie einen Datensatz halten

)

Sie einen

Delete from lead_detail where lead_id in (above query) 

Nach Doppel Prüfergebnis