Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Doppelte Zeilen entfernen und nur die älteste Zeile belassen?

Da Sie die ID-Spalte als Indikator dafür verwenden, welcher Datensatz "Original" ist:

delete x 
from myTable x
 join myTable z on x.subscriberEmail = z.subscriberEmail
where x.id > z.id

Dies hinterlässt einen Datensatz pro E-Mail-Adresse.

bearbeiten um hinzuzufügen:

Um die obige Abfrage zu erklären...

Die Idee hier ist, den Tisch gegen sich selbst zu vereinen. Stellen Sie sich vor, Sie hätten zwei Kopien der Tabelle, jede mit einem anderen Namen. Dann könnten Sie sie miteinander vergleichen und die niedrigste ID oder für jede E-Mail-Adresse finden. Sie sehen dann die später entstandenen Duplikate und können diese löschen. (Ich habe Excel visualisiert, als ich darüber nachgedacht habe.)

Um diese Operation an einer Tabelle durchzuführen, sie mit sich selbst zu vergleichen und jede Seite identifizieren zu können, verwenden Sie Tabellenaliase. x ist ein Tabellenalias. Es wird im from zugewiesen Klausel wie folgt:from <table> <alias> . x kann jetzt an anderer Stelle in derselben Abfrage verwendet werden, um auf diese Tabelle als Verknüpfung zu verweisen.

delete x startet die Abfrage mit unserer Aktion und unserem Ziel. Wir werden eine Abfrage durchführen, um Datensätze aus mehreren Tabellen auszuwählen, und wir möchten Datensätze löschen, die in x erscheinen .

Aliase werden verwendet, um auf beide „Instanzen“ der Tabelle zu verweisen. from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail stößt den Tisch gegen sich selbst, wo die E-Mails übereinstimmen. Ohne die folgende where-Klausel würde jeder Datensatz ausgewählt, da er mit sich selbst verknüpft werden könnte.

Das where -Klausel schränkt die ausgewählten Datensätze ein. where x.id > z.id erlaubt die 'Instanz' mit dem Alias ​​x um nur die Datensätze zu enthalten, die mit E-Mails übereinstimmen, aber eine höhere id haben Wert. Die Daten, die Sie wirklich in der Tabelle haben möchten, eindeutige E-Mail-Adressen (mit der niedrigsten ID) sind nicht Teil von x und werden nicht gelöscht. Die einzigen Datensätze in x werden doppelte Datensätze (E-Mail-Adressen) sein, die eine höhere id haben als der ursprüngliche Datensatz für diese E-Mail-Adresse.

Die Join- und Where-Klauseln könnten in diesem Fall kombiniert werden:

delete x 
  from myTable x 
  join myTable z
    on x.subscriberEmail = z.subscriberEmail
      and x.id > z.id

Um Duplikate zu vermeiden, sollten Sie die Spalte "scriberEmail" zu einer eindeutigen indizierten Spalte machen.