Ich möchte doppelte Datensätze in einer MySQL-Datenbank abrufen. Dies kann erfolgen mit:
SELECT address, count(id) as cnt FROM list
GROUP BY address HAVING cnt > 1
Was in ... resultiert:
100 MAIN ST 2
Ich möchte es so ziehen, dass es jede Zeile zeigt, die ein Duplikat ist. Etwas wie:
JIM JONES 100 MAIN ST
JOHN SMITH 100 MAIN ST
Irgendwelche Gedanken darüber, wie das gemacht werden kann? Ich versuche zu vermeiden, den ersten zu machen und dann die Duplikate mit einer zweiten Abfrage im Code nachzuschlagen.
mysql
duplicates
Chris Bartow
quelle
quelle
quelle
->having(DB::raw('count(*)'), '>', 2)
Abfrage hinzufügen . Danke vielmals!>=2
? VerwendenHAVING COUNT(*) > 1
Warum nicht einfach INNER mit sich selbst auf den Tisch treten?
Ein DISTINCT wird benötigt, wenn die Adresse mehr als zweimal vorhanden sein könnte.
quelle
WHERE a.id > b.id
, dass nur neuere Duplikate herausgefiltert werden. Auf diese Weise kann ichDELETE
direkt auf das Ergebnis zugreifen. Wechseln Sie den Vergleich, um die älteren Duplikate aufzulisten.Ich habe versucht, die beste Antwort für diese Frage zu finden, aber es hat mich etwas verwirrt. Ich brauchte das eigentlich nur auf einem einzigen Feld von meinem Tisch. Das folgende Beispiel von diesem Link hat für mich sehr gut funktioniert:
quelle
Dies ist die ähnliche Abfrage, nach der Sie gefragt haben, und sie funktioniert zu 200% und ist auch einfach. Genießen!!!
quelle
Ist das nicht einfacher:
?
quelle
Finden Sie mit dieser Abfrage doppelte Benutzer anhand der E-Mail-Adresse ...
quelle
Wir können feststellen, dass die Duplikate auch von mehr als einem Feld abhängen. In diesen Fällen können Sie das folgende Format verwenden.
quelle
Das Auffinden doppelter Adressen ist viel komplexer als es scheint, insbesondere wenn Sie Genauigkeit benötigen. Eine MySQL-Abfrage reicht in diesem Fall nicht aus ...
Ich arbeite bei SmartyStreets , wo wir uns mit Validierung und und anderen befassen, und ich habe viele verschiedene Herausforderungen mit ähnlichen Problemen gesehen.
Es gibt mehrere Dienste von Drittanbietern, die Duplikate in einer Liste für Sie markieren. Wenn Sie dies ausschließlich mit einer MySQL-Unterabfrage tun, werden Unterschiede in den Adressformaten und -standards nicht berücksichtigt. Der USPS (für US-Adresse) hat bestimmte Richtlinien, um diesen Standard festzulegen, aber nur eine Handvoll Anbieter sind für die Durchführung solcher Vorgänge zertifiziert.
Daher würde ich empfehlen, dass die beste Antwort für Sie darin besteht, die Tabelle beispielsweise in eine CSV-Datei zu exportieren und an einen fähigen Listenprozessor zu senden. Eines davon ist das SmartyStreets Bulk Address Validation Tool, das es in wenigen Sekunden bis zu einigen Minuten automatisch für Sie erledigt. Doppelte Zeilen werden mit einem neuen Feld namens "Duplizieren" und einem Wert von gekennzeichnet
Y
.quelle
Eine andere Lösung wäre die Verwendung von Tabellenaliasnamen wie folgt:
Alles , was Sie wirklich in diesem Fall tun wird , um die Original - Aufnahme Liste Tabelle, die Schaffung von zwei p retend Tabellen - p 1 und p 2 - aus , dass, und dann eine Verknüpfung auf der Adress - Spalte (Zeile 3) durchgeführt wird . In der 4. Zeile wird sichergestellt, dass derselbe Datensatz in Ihren Ergebnissen nicht mehrmals angezeigt wird ("doppelte Duplikate").
quelle
Nicht sehr effizient, aber es sollte funktionieren:
quelle
Dadurch werden Duplikate in einem Tabellendurchlauf ausgewählt, keine Unterabfragen.
Diese Abfrage emuliert aktiv das
ROW_NUMBER()
Vorhandensein inOracle
undSQL Server
Weitere Informationen finden Sie im Artikel in meinem Blog:
MySQL
.quelle
FROM (SELECT ...) aoo
ist eine Unterabfrage :-PDies zeigt Ihnen auch, wie viele Duplikate vorhanden sind, und ordnet die Ergebnisse ohne Verknüpfungen
quelle
quelle
SELECT users.name, users.uid, users.mail, from_unixtime(created) FROM users INNER JOIN ( SELECT mail FROM users GROUP BY mail HAVING count(mail) > 1 ) dup ON users.mail = dup.mail ORDER BY users.mail, users.created;
Für Ihren Tisch wäre es so etwas wie
Diese Abfrage gibt Ihnen alle eindeutigen Adresseinträge in Ihrer Listentabelle ... Ich bin nicht sicher, wie dies funktionieren wird, wenn Sie Primärschlüsselwerte für Name usw. haben.
quelle
Schnellstes Verfahren zum Entfernen von Duplikaten:
quelle
Persönlich hat diese Abfrage mein Problem gelöst:
In diesem Skript werden alle mehr als einmal vorhandenen Abonnenten-IDs in der Tabelle und die Anzahl der gefundenen Duplikate angezeigt.
Dies sind die Tabellenspalten:
Hoffe, es wird auch für Sie hilfreich sein!
quelle
Ersetzen Sie die Stadt durch Ihren Tisch. Ersetzen Sie den Namen durch Ihren Feldnamen
quelle
quelle
quelle
Um die doppelten Zeilen schnell zu sehen, können Sie eine einzelne einfache Abfrage ausführen
Hier frage ich die Tabelle ab und liste alle doppelten Zeilen mit derselben Benutzer-ID, demselben Marktplatz und derselben SKU auf:
Um die doppelte Zeile zu löschen, müssen Sie entscheiden, welche Zeile Sie löschen möchten. ZB die mit niedrigerer ID (normalerweise älter) oder andere Datumsinformationen. In meinem Fall möchte ich nur die niedrigere ID löschen, da die neuere ID die neuesten Informationen enthält.
Überprüfen Sie zunächst, ob die richtigen Datensätze gelöscht werden. Hier wähle ich den Datensatz unter den Duplikaten aus, die gelöscht werden (nach eindeutiger ID).
Dann führe ich die Löschabfrage aus, um die Dupes zu löschen:
Backup, Double Check, Verify, Verify Backup und dann ausführen.
quelle
select address from list where address = any (select address from (select address, count(id) cnt from list group by address having cnt > 1 ) as t1) order by address
Die innere Unterabfrage gibt Zeilen mit doppelter Adresse zurück, während die äußere Unterabfrage die Adressspalte für Adresse mit doppelten Adressen zurückgibt. Die äußere Unterabfrage darf nur eine Spalte zurückgeben, da sie als Operand für den Operator '= any' verwendet wird.
quelle
Die Antwort von Powerlord ist in der Tat die beste und ich würde eine weitere Änderung empfehlen: Verwenden Sie LIMIT, um sicherzustellen, dass db nicht überlastet wird:
Es ist eine gute Angewohnheit, LIMIT zu verwenden, wenn es kein WO gibt und wenn Verknüpfungen hergestellt werden. Beginnen Sie mit einem kleinen Wert, überprüfen Sie, wie schwer die Abfrage ist, und erhöhen Sie dann das Limit.
quelle