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: 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: 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:
|
<<: js implementiert eine einfache dreistufige Auswahlkaskade für Provinzen, Gemeinden und Bezirke
>>: Detaillierte Analyse, wann Tomcat das Antwortdatagramm zurückschreibt
<html> <Kopf> <meta http-equiv=&quo...
Wie in der Abbildung gezeigt: Aber bei der Anzeig...
Finden Sie das Problem Heute werde ich den Tomcat...
Ich habe verschiedene große Websites durchsucht u...
Installieren Sie nginx Beachten Sie, dass Sie ngi...
Schritt 1: Ubuntu-Quelle hinzufügen Wechseln Sie ...
Inhaltsverzeichnis 1. Vertikales (längsseitiges) ...
Grafisches Tutorial zur Installation und Konfigur...
Heute bin ich wieder in die Falle getappt. Ich bi...
Die goldene Regel Unabhängig davon, wie viele Per...
Inhaltsverzeichnis 1: Einführung in Galera-Cluste...
Fügen Sie die Datei jvm.options zur Elasticsearch...
Inhaltsverzeichnis Transaktionsisolationsebene Wa...
Vorwort Eine Anforderung, die ich zuvor zur Verei...
Beginnen wir mit einer Beschreibung des Problems:...