INSERT INTO hk_test(Benutzername, Passwort) VALUES ('qmf1', 'qmf1'),('qmf2', 'qmf11') Löschen aus hk_test, wobei Benutzername='qmf1' und Passwort='qmf1' Doppelte Datensätze in der Tabelle in MySQL abfragen: Schauen Sie sich zunächst die wiederholten Rohdaten an: Szenario 1: Auflisten der Daten mit wiederholten Lesevorgängen im Feld „Benutzername“ Wählen Sie Benutzernamen, Anzahl(*) als Anzahl aus der hk_test-Gruppe nach Benutzernamen mit Anzahl >1; SELECT username,count(username) as count FROM hk_test GROUP BY username HAVING count(username) >1 ORDER BY count DESC; Bei dieser Methode wird nur die konkrete Anzahl der Wiederholungen des Feldes gezählt. Szenario 2: Listen Sie die spezifischen Informationen zu doppelten Datensätzen im Feld „Benutzername“ auf: select * from hk_test where username in (wählen Sie Benutzernamen aus der hk_test-Gruppe nach Benutzernamen mit count(username) > 1) SELECT Benutzername, Passwort FROM hk_test WHERE Benutzername in ( SELECT Benutzername FROM hk_test GROUP BY Benutzername HAVING count(Benutzername)>1) Allerdings ist diese Anweisung in MySQL zu ineffizient. Es fühlt sich an, als würde MySQL keine temporäre Tabelle für die Unterabfrage generieren. Bei großen Datenmengen dauert es lange Lösung: Erstellen Sie also zunächst eine temporäre Tabelle mit create table `tmptable` as ( WÄHLEN Sie „Name“ VON `Tabelle` GRUPPE NACH `Name` MIT Anzahl(`Name`) > 1 ); Verwenden Sie dann die Multi-Table-Join-Abfrage SELECT a.`id`, a.`name` VON `table` a, `tmptable` t WO a.`name` = t.`name`; Diesmal kamen die Ergebnisse sehr schnell heraus. Verwenden Sie distinct, um Duplikate zu entfernen. SELECT distinct a.`id`, a.`name` VON `table` a, `tmptable` t WO a.`name` = t.`name`; Szenario 3: Datensätze mit doppelten Feldern anzeigen: Beispielsweise gibt es doppelte Datensätze sowohl im Benutzernamen- als auch im Kennwortfeld: wähle * aus hk_test a wobei (a.Benutzername,a.Passwort) in (Benutzernamen,Passwort aus der hk_test-Gruppe nach Benutzername,Passwort mit Anzahl(*) > 1 auswählen) Szenario 4: Abfrage von Datensätzen mit mehreren gleichzeitig in der Tabelle wiederholten Feldern: Wählen Sie Benutzernamen, Passwort und Anzahl (*) aus der hk_test-Gruppe nach Benutzernamen und Passwort mit Anzahl (*) > 1. So fragen Sie doppelte Datensätze in einer MySQL-Abfragetabelle ab und löschen sie (Teil 1) 1. Suchen Sie in der Tabelle nach redundanten doppelten Datensätzen. Doppelte Datensätze werden anhand eines einzelnen Felds (peopleId) ermittelt. Wählen Sie * von Leuten wobei peopleId in (wählen Sie peopleId aus der Personengruppe nach peopleId mit count(peopleId)>1) 2. Löschen Sie die redundanten doppelten Datensätze in der Tabelle. Doppelte Datensätze werden anhand eines einzigen Felds (peopleId) ermittelt. Es bleibt nur ein Datensatz übrig. Aus Personen löschen wobei peopleId in (wählen Sie peopleId aus der Personengruppe nach peopleId mit count(peopleId)>1) und min(id) nicht in (wählen Sie die ID aus der Personengruppe nach Personen-ID mit count(peopleId)>1) 3. Suchen Sie nach redundanten doppelten Datensätzen in der Tabelle (mehrere Felder). Wählen Sie * aus Lebenslauf a wobei (a.peopleId,a.seq) in (Wählen Sie peopleId,seq aus der Vitae-Gruppe nach peopleId,seq mit count(*)>1) 4. Löschen Sie redundante doppelte Datensätze (mehrere Felder) in der Tabelle, so dass nur der Datensatz mit der kleinsten Zeilen-ID übrig bleibt. Wo (a.peopleId,a.seq) in (wählen Sie peopleId,seq aus der Vitae-Gruppe nach peopleId,seq aus mit count(*) > 1) und rowid nicht in (select min(rowid) aus vitae-Gruppe nach peopleId,seq mit count(*)>1) 5. Suchen Sie in der Tabelle nach redundanten doppelten Datensätzen (mehrere Felder), wobei Sie den Datensatz mit der kleinsten Zeilen-ID ausschließen. select * from vitae a Wo (a.peopleId,a.seq) in (wählen Sie peopleId,seq aus der Vitae-Gruppe nach peopleId,seq aus mit count(*) > 1) und rowid nicht in (select min(rowid) aus vitae-Gruppe nach peopleId,seq mit count(*)>1) (zwei) Beispielsweise gibt es in Tabelle A ein Feld „Name“, und die „Name“-Werte zwischen verschiedenen Datensätzen können gleich sein. Jetzt müssen wir die Elemente mit doppelten „Name“-Werten zwischen den Datensätzen in der Tabelle herausfinden. Wählen Sie Name,Anzahl(*) aus einer Gruppe nach Namen mit Anzahl(*) > 1 aus. Bei gleichem Geschlecht ergeben sich folgende Ergebnisse: Wählen Sie Name, Geschlecht, Anzahl(*) aus einer Gruppe nach Name, Geschlecht mit Anzahl(*) > 1 (drei) Methode 1: @max Integer und @id Integer deklarieren Deklarieren Sie den cur_rows-Cursor lokal, um das Primärfeld auszuwählen, count(*) aus der Tabellennamengruppe nach dem Primärfeld mit count(*) >; 1 öffne cur_rows hole cur_rows in @id,@max während @@fetch_status=0 beginnen wähle @max = @max -1 Zeilenanzahl @max festlegen Löschen aus Tabellenname, wobei primäres Feld = @id hole cur_rows in @id,@max Ende Schließen Sie cur_rows setze Zeilenanzahl auf 0 SELECT * from tab1 where CompanyName in (SELECT companyname from tab1 GROUP BY CompanyName HAVING COUNT(*)>1); -- 129,433 ms SELECT * von tab1 INNER join (SELECT Firmenname von tab1 GROUP BY Firmenname HAVING COUNT(*)>1) als tab2 USING(Firmenname); – 0,482 ms Bei Methode 2 gibt es doppelte Datensätze in zweierlei Hinsicht: zum einen gibt es vollständig doppelte Datensätze, d. h. Datensätze, bei denen sich alle Felder wiederholen; zum anderen gibt es Datensätze, bei denen sich einige Schlüsselfelder wiederholen, z. B. das Feld „Name“, während andere Felder möglicherweise nicht wiederholt werden oder alle Wiederholungen ignoriert werden können. 1. Für den ersten Duplizierungstyp ist es einfacher zu lösen. Verwenden Sie select distinct * from tableName Sie können einen Ergebnissatz ohne doppelte Datensätze erhalten. Wenn die Tabelle doppelte Datensätze löschen muss (nur einen doppelten Datensatz behalten), können Sie ihn wie folgt löschen: select distinct * into #Tmp from tableName Tabelle Tabellenname löschen Wählen Sie * in Tabellenname aus #Tmp Tabelle löschen #Tmp Diese Duplizierung tritt aufgrund eines schlechten Tabellendesigns auf und kann durch das Hinzufügen einer eindeutigen Indexspalte behoben werden. 2. Bei dieser Art von Duplizierungsproblem muss normalerweise der erste Datensatz der doppelten Datensätze beibehalten werden. Die Vorgehensweise ist wie folgt: Angenommen, die doppelten Felder sind Name und Adresse, und Sie müssen für diese beiden Felder einen eindeutigen Ergebnissatz erhalten. select identity(int,1,1) as autoID, * into #Tmp from tableName Wählen Sie min(autoID) als AutoID in #Tmp2 aus der #Tmp-Gruppe nach Name, AutoID wähle * aus #Tmp, wobei autoID in (wähle autoID aus #tmp2) ist Die letzte Auswahl gibt einen Ergebnissatz mit eindeutigem Namen und Adresse zurück (aber mit einem zusätzlichen AutoID-Feld, das beim Schreiben in der Select-Klausel weggelassen werden kann). (IV) Abfrage wiederholt select * from tablename where id in ( Wählen Sie die ID aus der Tabellennamengruppe nach ID mit count(id) > 1) Häufig verwendete Anweisungen 1. Suchen Sie in der Tabelle nach redundanten doppelten Datensätzen. Doppelte Datensätze werden anhand eines einzelnen Felds (mail_id) ermittelt. Der Code lautet wie folgt: Code kopieren SELECT * FROM table WHERE mail_id IN (SELECT mail_id FROM table GROUP BY mail_id HAVING COUNT(mail_id) > 1); 2. Löschen Sie redundante doppelte Datensätze in der Tabelle. Doppelte Datensätze werden anhand eines einzigen Felds (mail_id) ermittelt. Nur der Datensatz mit der kleinsten Zeilen-ID wird beibehalten. Der Code lautet wie folgt: DELETE FROM table WHERE mail_id IN (SELECT mail_id FROM table GROUP BY mail_id HAVING COUNT(mail_id) > 1) AND rowid NOT IN (SELECT MIN(rowid) FROM table GROUP BY mail_id HAVING COUNT(mail_id )>1); 3. Suchen Sie nach redundanten doppelten Datensätzen in der Tabelle (mehrere Felder). Der Code lautet wie folgt: Code kopieren SELECT * FROM table WHERE (mail_id,phone) IN (SELECT mail_id,phone FROM table GROUP BY mail_id,phone HAVING COUNT(*) > 1); 4. Löschen Sie redundante doppelte Datensätze (mehrere Felder) in der Tabelle und behalten Sie nur den Datensatz mit der kleinsten Zeilen-ID. Der Code lautet wie folgt: DELETE FROM table WHERE (mail_id,phone) IN (SELECT mail_id,phone FROM table GROUP BY mail_id,phone HAVING COU(www.jb51.net)NT(*) > 1) AND rowid NOT IN (SELECT MIN(rowid) FROM table GROUP BY mail_id,phone HAVING COUNT(*)>1); 5. Suchen Sie in der Tabelle nach redundanten doppelten Datensätzen (mehrere Felder), und schließen Sie dabei den Datensatz mit der kleinsten Zeilen-ID aus. Der Code lautet wie folgt: SELECT * FROM table WHERE (a.mail_id,a.phone) IN (SELECT mail_id,phone FROM table GROUP BY mail_id,phone HAVING COUNT(*) > 1) AND rowid NOT IN (SELECT MIN(rowid) FROM table GROUP BY mail_id,phone HAVING COUNT(*)>1); Gespeicherte Prozedur deklariert @max integer,@id integer Deklarieren Sie den cur_rows-Cursor lokal, um das Primärfeld auszuwählen, count(*) aus der Tabellennamengruppe nach dem Primärfeld mit count(*) >; 1 öffne cur_rows hole cur_rows in @id,@max während @@fetch_status=0 beginnen wähle @max = @max -1 Zeilenanzahl @max festlegen Löschen aus Tabellenname, wobei primäres Feld = @id hole cur_rows in @id,@max Ende Schließen Sie cur_rows setze Zeilenanzahl auf 0 (I) Einzelnes Feld 1. Suchen Sie in der Tabelle nach redundanten doppelten Datensätzen und beurteilen Sie diese nach dem Feld (question_title). Der Code lautet wie folgt: Kopieren Sie den Code select * from questions where question_title in (select question_title from people group by question_title having count(question_title) > 1) 2. Löschen Sie die redundanten doppelten Datensätze in der Tabelle. Laut dem Feld (question_title) ist nur noch ein Datensatz übrig. Der Code lautet wie folgt: Kopieren Sie den Code „delete from questions“ wobei peopleId in (wählen Sie peopleId aus der Personengruppe nach peopleId mit count(question_title) > 1) und min(id) nicht in (wählen Sie question_id aus der Fragengruppe nach question_title mit count(question_title)>1) (II) Mehrere Felder Löschen Sie redundante doppelte Datensätze (mehrere Felder) in der Tabelle, sodass nur der Datensatz mit der kleinsten Zeilen-ID übrig bleibt. Der Code lautet wie folgt: Code kopieren DELETE FROM questions WHERE (questions_title,questions_scope) IN (SELECT questions_title,questions_scope FROM questions GROUP BY questions_title,questions_scope HAVING COUNT(*) > 1) AND question_id NOT IN (SELECT MIN(question_id) FROM questions GROUP BY questions_scope,questions_title HAVING COUNT(*)>1) Mit der obigen Anweisung können die Daten nicht gelöscht werden. Bevor die Tabelle gelöscht werden kann, muss eine temporäre Tabelle erstellt werden. Können Sie mir das bitte erklären? Der Code lautet wie folgt. Kopieren Sie den Code CREATE TABLE tmp AS SELECT question_id FROM questions WHERE (questions_title,questions_scope) IN (SELECT questions_title,questions_scope FROM questions GROUP BY questions_title,questions_scope HAVING COUNT(*) > 1) AND question_id NOT IN (SELECT MIN(question_id) FROM questions GROUP BY questions_scope,questions_title HAVING COUNT(*)>1); LÖSCHEN AUS Fragen, wobei Frage-ID IN (AUSWÄHLEN Frage-ID AUS tmp); Tabelle löschen tmp; Suchen Sie nach doppelten Datensätzen in der MySQL-Tabelle Die folgende SQL-Anweisung kann alle doppelten Datensätze in einer Tabelle finden. Parameterbeschreibung: Benutzername ist das wiederholte Feld, nach dem gesucht werden soll. Mithilfe der Funktion „Count“ wird ermittelt, ob die Zahl größer als eins ist und ob sie wiederholt wird. user_table ist der Name der zu durchsuchenden Tabelle. group by wird zum Gruppieren verwendet „have“ wird zum Filtern verwendet. Ersetzen Sie die Parameter durch die entsprechenden Feldparameter Ihrer eigenen Datentabelle. Sie können es zunächst in Phpmyadmin oder Navicat ausführen, um zu sehen, welche Daten sich wiederholen, und diese dann in der Datenbank löschen. Sie können die SQL-Anweisung auch direkt in die Hintergrundseite einfügen, die Nachrichten liest, sie auslesen und sie zu einer Liste doppelter Daten für die Abfrage vervollständigen. Wenn Duplikate vorhanden sind, können Sie diese direkt löschen. Die Wirkung ist wie folgt: Nachteile: Der Nachteil dieser Methode besteht darin, dass die Effizienz sehr gering ist, wenn die Datenmenge in Ihrer Datenbank groß ist. Ich habe Navicat verwendet, um es zu testen. Die Datenmenge war nicht groß und die Effizienz war sehr hoch. Natürlich hat die Website auch andere SQL-Anweisungen, die die Abfragedaten wiederholen. Sie können daraus lernen und es sorgfältig studieren, um eine Abfrageanweisung zu finden, die zu Ihrer Website passt. Das könnte Sie auch interessieren:
|
<<: Ausführliche Erläuterung des globalen Status des WeChat-Applets
>>: Detaillierte Erläuterung des Mechanismus und der Implementierung der Accept-Sperre in Nginx
„HTML-Validierung“ bezieht sich auf die HTML-Valid...
Als ich vor ein paar Tagen ein dreispaltiges Layou...
Inhaltsverzeichnis Vorwort verwenden Komponentens...
„explain“ wird verwendet, um Informationen zum Ab...
Inhaltsverzeichnis 1. Konzept 1.1 Was sind Fehler...
Heute stelle ich zwei HTML-Tags vor, die ich nich...
1. Einleitung Die Standortanweisung ist die Kernk...
In diesem Artikel finden Sie das Installations-Tu...
Ich habe den Quellcode des Fabric-Projekts noch e...
Vorwort Als wir das Pferd geschrieben haben, wuss...
Obwohl die papierlose Welt noch nicht angebrochen...
Um die Leistung von MySQL anzupassen und den Dien...
1. Voraussetzungen: Die Datenbanksicherung ist be...
Die Gesamtarchitektur von MySQL ist in die Server...
<br />Das Navigationsdesign stellt eine der ...