Eine SQL-Anweisung schließt die MySQL-Deduplizierung ab und behält eine

Eine SQL-Anweisung schließt die MySQL-Deduplizierung ab und behält eine

Als ich vor einigen Tagen an einer Anforderung arbeitete, musste ich doppelte Datensätze in MySQL bereinigen. Damals dachte ich darüber nach, es durch Code-Traversierung auszuschreiben, aber dann fand ich es zu kompliziert und dachte, das Problem sollte durch eine SQL-Anweisung gelöst werden. Nachdem ich die Informationen überprüft und die Experten konsultiert hatte, kam ich auf eine sehr praktische SQL-Anweisung. Hier teile ich diese SQL-Anweisung und Ideen.

Bedarfsanalyse

Es gibt doppelte Datensätze in der Datenbank. Löschen Sie einen und behalten Sie einen (die Grundlage zur Bestimmung, ob es sich um einen Duplikat handelt, sind mehrere Felder).

Lösung

Als ich auf diese Anforderung stieß, hatte ich wahrscheinlich einige Ideen im Kopf. Das Erste, was mir in den Sinn kommt, ist, dass es mit einer SQL-Anweisung gelöst werden kann, aber ich habe nicht viel Erfahrung mit komplexen SQL-Anweisungen, deshalb möchte ich einen Experten um Hilfe bitten.

Finden Sie jemanden, der Ihnen hilft

Da diese Anforderung etwas dringend ist, dachte ich zuerst daran, einen Kollegen auf diesem Gebiet zu finden, der das Problem lösen kann, und dieses Problem dann mit meinem Kollegen zu teilen. Als Ergebnis hat dieser Typ einfach Baidu aufgerufen und mir eine SQL-Anweisung gegeben, die ich noch nie zuvor verwendet hatte, und mich gebeten, es selbst zu versuchen. Viele Dinge gingen mir durch den Kopf ...

Baidu

Eine SQL-Anweisung gefunden:

LÖSCHEN
AUS
 Vitamin A
WO
 (eine.Personen-ID, eine.Sequenz) IN (
  WÄHLEN
   Personen-ID,
   Folge
  AUS
   Lebenslauf
  GRUPPELN NACH
   Personen-ID,
   Folge
  HABEN
   Anzahl(*) > 1
 )
UND rowid NICHT IN (
 WÄHLEN
  min(Zeilen-ID)
 AUS
  Lebenslauf
 GRUPPELN NACH
  Personen-ID,
  Folge
 HABEN
  Anzahl(*) > 1
)

Diese Anweisung finden Sie im Artikel [Löschen Sie doppelte Daten in MySQL und behalten Sie nur einen]. Die Idee dieser SQL-Anweisung ist sehr klar und besteht aus drei Schritten:

SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 um als Bedingung doppelte Datensätze in der Tabelle zu finden

SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Abfrage des kleinsten ID-Wertes in den doppelten Datensätzen in der Tabelle als zweite Bedingung

Löschen Sie abschließend gemäß den beiden oben genannten Bedingungen die verbleibenden doppelten Datensätze mit Ausnahme der kleinsten ID in den doppelten Datensätzen

Leider ist beim Ausführen dieser Anweisung ein Fehler aufgetreten. Die allgemeine Bedeutung des Fehlers besteht darin, dass die Tabelle nicht gleichzeitig mit der Abfrage aktualisiert werden kann.

Code-Lösung

Basierend auf der obigen SQL-Anweisung ist es möglich, dasselbe Ziel in zwei Schritten durch Code zu erreichen:

Entfernen Sie zuerst die doppelten Datensätze

Entsprechend dem abgefragten Datensatz wird eine Schleife ausgeführt, um die verbleibenden doppelten Daten zu löschen

Ich hatte die Idee und schrieb sie schnell, aber ich war schockiert, als ich sie ausführte. Es dauerte ungefähr 116 Sekunden . Dann dachte ich, ich muss eine SQL-Anweisung finden, die verwendet werden kann. Ich habe den Code und die Ergebnisse der Ausführung gepostet:

Perfektes [Duplikate entfernen und einen behalten] SQL

Schließlich bekam ich in einer technischen Gruppe die perfekte Antwort. Sehen Sie sich diese SQL-Anweisung an:

Verbrauchsdatensatz löschen
AUS
 Verbrauchsdatensatz, 
 (
  WÄHLEN
   min(id)-ID,
   Benutzer-ID,
   monetär,
   verbrauchszeit
  AUS
   Verbrauchsdatensatz
  GRUPPELN NACH
   Benutzer-ID,
   monetär,
   verbrauchszeit
  HABEN
   Anzahl(*) > 1
 ) t2
WO
 consum_record.Benutzer-ID = t2.Benutzer-ID 
 und consum_record.monetary = t2.monetary
 und consum_record.consume_time = t2.consume_time
UND consum_record.id > t2.id;

Wenn Sie sich die obige SQL-Anweisung genau ansehen, ist es nicht schwer, die Idee zu verstehen. Sie kann in drei Schritten verstanden werden:

(SELECT min(id) id, user_id, monetary, consume_time FROM consum_record GROUP BY user_id, monetary, consume_time HAVING count(*) > 1 ) t2 (temporäre Tabelle t2), der die Mindest-ID jedes doppelten Datensatzes enthält

consum_record.user_id = t2.user_id and consum_record.monetary = t2.monetary and consum_record.consume_time = t2.consume_time sind die Felder, die zur Bestimmung der Duplizierungsbasis verwendet werden .

Löschen Sie gemäß den Bedingungen die Datensätze in der Originaltabelle, deren ID größer als die ID in t2 ist

Als ich diesen Satz sah, fand ich ihn erstaunlich. Eine so einfache SQL-Anweisung kann tatsächlich ein so komplexes Problem lösen. Das ist wirklich interessant!

Es läuft auch superschnell. Die Ausführung der ursprünglichen Codeschleife dauert etwa 116 Sekunden , aber hier dauert es nur 0,3 Sekunden . Erstaunlich~

Zusammenfassen

Als PHP-Programmierer ist es naheliegend, dass SQL nicht hinterherhinken sollte. In der Realität gibt es jedoch zu viele Dinge zu tun und mein aktuelles SQL-Niveau ist nur durchschnittlich. Ich werde in Zukunft eine Gelegenheit finden, mein Wissen in diesem Bereich zu verbessern.

Das ist alles für heute.

Das könnte Sie auch interessieren:
  • MySQL-Entwicklungskenntnisse: JOIN-Update und Datenduplikationsprüfung/Deduplizierung
  • Implementierungsanweisungen zur Duplikatsprüfung und Deduplizierung von MySQL-Daten
  • MySQL-Deduplizierungsmethoden
  • Eine kurze Diskussion zur Deduplizierung in SQL-Datenbanken
  • Ein kleines Beispiel für SQL-Gruppierung und -Sortierung zum Entfernen von Duplikaten
  • Detaillierte Erklärung zweier Methoden zur Deduplizierung in MySQL und Beispielcode
  • Eine praktische Anleitung zum Prüfen und Entfernen doppelter SQL-Befehle

<<:  js implementiert eine einfache dreistufige Auswahlkaskade für Provinzen, Gemeinden und Bezirke

>>:  Detaillierte Analyse, wann Tomcat das Antwortdatagramm zurückschreibt

Artikel empfehlen

Fehler mit ungerader Breite und Höhe in IE6

Wie in der Abbildung gezeigt: Aber bei der Anzeig...

Zusammenfassung einiger verwandter Vorgänge geplanter Linux-Aufgaben

Ich habe verschiedene große Websites durchsucht u...

So teilen Sie Daten in MySQL-Tabellen und -Datenbanken auf

Inhaltsverzeichnis 1. Vertikales (längsseitiges) ...

HTML5+CSS3-Codierungsstandards

Die goldene Regel Unabhängig davon, wie viele Per...

Lösung für den ES-Speicherüberlauf beim Starten von Docker

Fügen Sie die Datei jvm.options zur Elasticsearch...

Detaillierte Erklärung zu Unique Constraints und NULL in MySQL

Vorwort Eine Anforderung, die ich zuvor zur Verei...

Lösung für den Konflikt zwischen zwei Registerkartennavigation in HTML

Beginnen wir mit einer Beschreibung des Problems:...