Vor ein paar Tagen, als ich eine Anforderung gemacht habe, musste ich die doppelten Datensätze in MySQL bereinigen, und damals war die Idee, sie durch Codedurchlauf zu schreiben, und dann dachte ich, es sei zu kompliziert, weil ich dachte, ich könnte das Problem mit einer SQL-Anweisung lösen. Nachdem ich die Informationen überprüft und den Chef konsultiert habe, habe ich eine sehr praktische SQL-Anweisung entwickelt, und hier werde ich diese SQL-Ausweisung und Ideen teilen.
Bedarfsanalyse
Wenn es doppelte Datensätze in der Datenbank gibt, lösche und behalte einen davon (unabhängig davon, ob die Kriterien zur Bestimmung doppelter Felder mehrere Felder sind)
Lösung
Wenn Sie diesem Bedürfnis begegnen, haben Sie wahrscheinlich eine Idee im Herzen. Das Schnellste, was mir eingefallen ist, war, dass ich es mit einer SQL-Anweisung lösen könnte, aber ich war zu oberflächlich in komplexen SQL-Anweisungen, also wollte ich den Chef um Hilfe bitten.
Finde jemanden, der dir hilft.
因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给@赵七七同学,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...
Eigenes Baidu
Ich habe eine SQL-Anweisung gefunden:
Diese SQL-Idee ist offensichtlich, es gibt die folgenden drei Schritte:
- SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Abfrage von doppelten Datensätzen in der Tabelle als Bedingung
- SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Die zweite Bedingung ist der kleinste Wert der ID in den doppelten Datensätzen in der Abfragetabelle
- Schließlich löschen Sie gemäß den beiden obigen Bedingungen die verbleibenden doppelten Datensätze, mit Ausnahme der kleinsten ID im doppelten Datensatz
Leider gibt es jedoch einen Fehler bei der Ausführung dieser Anweisung, was ungefähr bedeutet, dass die Tabelle nicht gleichzeitig mit der Abfrage aktualisiert werden kann.
Code gelöst
Basierend auf der obigen SQL-Anweisung denke ich, dass du dasselbe Ziel in zwei Schritten durch Code erreichen kannst:
- Zuerst werden doppelte Datensätze entnommen
- Basierend auf dem abgefragten Datensatz werden die verbleibenden Duplikate in einer Schleife entfernt
Ich hatte eine Idee und schrieb sie schnell, aber ich war schockiert, als ich sie veröffentlichte, und ich brauchte sie tatsächlich116erlinks und rechts, und dann möchte ich eine SQL-Anweisung finden, die ich verwenden kann, den Code und das laufende Ergebnis einfügen:
Perfekte [Deduplizierung und lassen eine] SQL
Schließlich habe ich in einer technischen Gruppe eine perfekte Antwort bekommen, schau dir diese SQL-Aussage an:
Die oben genannte SQL-Aussage ist bei genauerem Hinsehen nicht schwer, die Idee zu verstehen, und sie ist wahrscheinlich in drei Schritte unterteilt, um sie zu verstehen:
- (SELECT min(id) id, user_id, monetary, consume_time FROM consum_record GROUP BY user_id, monetary, consume_time HAVING count(*) > 1) t2 Abfrage der doppelten Datensätze, um eine Sammlung (temporäre Tabelle t2) zu bilden, die die minimale ID jedes doppelten Datensatzes enthält
- consum_record.user_id = t2.user_id und consum_record.monetary = t2.monetary und consum_record.consume_time = t2.consume_time assoziierte Felder für die doppelten Kriterien
- Lösche Datensätze mit IDs größer als IDs in T2 gemäß den Bedingungen
Als ich diesen Satz sah, dachte ich mir, dass das zu kraftvoll ist. Eine so einfache SQL-Anweisung kann ein so komplexes Problem lösen, und die Haltung steigt~ Es ist außerdem super schnell zu laufen, die ursprüngliche Code-Schleife dauert etwa 116 Sekunden, aber hier reichen 0,3 Sekunden, erstaunlich~
|