mysql - spalten - sql nach duplikaten suchen
Finde doppelte Datensätze in MySQL (15)
Dadurch werden Duplikate in einem Tabellenpass, keine Unterabfragen ausgewählt.
SELECT *
FROM (
SELECT ao.*, (@r := @r + 1) AS rn
FROM (
SELECT @_address := 'N'
) vars,
(
SELECT *
FROM
list a
ORDER BY
address, id
) ao
WHERE CASE WHEN @_address <> address THEN @r := 0 ELSE 0 END IS NOT NULL
AND (@_address := address ) IS NOT NULL
) aoo
WHERE rn > 1
Diese Abfrage emuliert ROW_NUMBER()
in Oracle
und SQL Server
Siehe den Artikel in meinem Blog für Details:
- Analytische Funktionen: SUM, AVG, ROW_NUMBER - Emulation in
MySQL
.
Ich möchte doppelte Datensätze in einer MySQL-Datenbank herausziehen. Dies kann erfolgen mit:
SELECT address, count(id) as cnt FROM list
GROUP BY address HAVING cnt > 1
Was dazu führt:
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, die erste zu tun und dann die Duplikate mit einer zweiten Abfrage im Code nachzuschlagen.
Der Schlüssel besteht darin, diese Abfrage neu zu schreiben, damit sie als Unterabfrage verwendet werden kann.
SELECT firstname,
lastname,
list.address
FROM list
INNER JOIN (SELECT address
FROM list
GROUP BY address
HAVING COUNT(id) > 1) dup
ON list.address = dup.address;
Doppelte Adressen zu finden ist viel komplexer als es scheint, besonders wenn Sie Genauigkeit benötigen. Eine MySQL-Abfrage ist in diesem Fall nicht genug ...
Ich arbeite bei SmartyStreets , wo wir Adressvalidierung , Deduplizierung und andere Dinge angehen , und ich habe viele verschiedene Herausforderungen mit ähnlichen Problemen gesehen.
Es gibt mehrere Dienste von Drittanbietern, die Duplikate in einer Liste für Sie kennzeichnen. Wenn Sie dies ausschließlich mit einer MySQL-Unterabfrage tun, werden Unterschiede in Adressformaten und -standards nicht berücksichtigt. Die USPS (für die US-Adresse) hat bestimmte Richtlinien, um diesen Standard zu schaffen, aber nur eine Handvoll von Anbietern ist für solche Operationen zertifiziert.
Daher würde ich empfehlen, die Tabelle zum Beispiel in eine CSV-Datei zu exportieren und sie an einen fähigen Listenprozessor zu senden. Eine davon ist LiveAddress die es in wenigen Sekunden automatisch für Sie erledigt. Es kennzeichnet doppelte Zeilen mit einem neuen Feld namens "Duplicate" und einem Wert von Y
darin.
Eine andere Lösung wäre die Verwendung von Tabellenaliasnamen:
SELECT p1.id, p2.id, p1.address
FROM list AS p1, list AS p2
WHERE p1.address = p2.address
AND p1.id != p2.id
Alles, was Sie in diesem Fall wirklich tun, ist, die ursprüngliche Listentabelle zu übernehmen, zwei p relent-Tabellen - p 1 und p 2 - daraus zu erstellen und dann einen Join in der Adressspalte (Zeile 3) durchzuführen. Die vierte Zeile stellt sicher, dass der gleiche Datensatz nicht mehrfach in Ihrer Ergebnismenge auftaucht ("doppelte Duplikate").
Ist das nicht einfacher:
SELECT *
FROM tc_tariff_groups
GROUP BY group_id
HAVING COUNT(group_id) >1
?
Persönlich hat diese Abfrage mein Problem gelöst:
SELECT `SUB_ID`, COUNT(SRV_KW_ID) as subscriptions FROM `SUB_SUBSCR` group by SUB_ID, SRV_KW_ID HAVING subscriptions > 1;
Was dieses Skript ausführt, zeigt alle Abonnenten-IDs, die mehr als einmal in der Tabelle vorhanden sind, und die Anzahl der gefundenen Duplikate an.
Dies sind die Tabellenspalten:
| SUB_SUBSCR_ID | int(11) | NO | PRI | NULL | auto_increment |
| MSI_ALIAS | varchar(64) | YES | UNI | NULL | |
| SUB_ID | int(11) | NO | MUL | NULL | |
| SRV_KW_ID | int(11) | NO | MUL | NULL | |
Hoffe, es wird auch für Sie hilfreich sein!
Suchen Sie mit dieser Suchanfrage doppelte Benutzer nach E-Mail-Adresse ...
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
) dupes ON users.mail = dupes.mail
ORDER BY users.mail;
Warum nicht einfach INNER den Tisch mit sich selbst verbinden?
SELECT a.firstname, a.lastname, a.address
FROM list a
INNER JOIN list b ON a.address = b.address
WHERE a.id <> b.id
Ein DISTINCT wird benötigt, wenn die Adresse mehr als zweimal vorkommen kann.
Wird nicht sehr effizient sein, aber es sollte funktionieren:
SELECT *
FROM list AS outer
WHERE (SELECT COUNT(*)
FROM list AS inner
WHERE inner.address = outer.address) > 1;
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, und die äußere Unterabfrage gibt die Adressspalte für die Adresse mit Duplikaten zurück. Die äußere Unterabfrage muss nur eine Spalte zurückgeben, da sie als Operand für den Operator '= any' verwendet wurde.
Find duplicate Records:
Suppose we have table : Student
student_id int
student_name varchar
Records:
+------------+---------------------+
| student_id | student_name |
+------------+---------------------+
| 101 | usman |
| 101 | usman |
| 101 | usman |
| 102 | usmanyaqoob |
| 103 | muhammadusmanyaqoob |
| 103 | muhammadusmanyaqoob |
+------------+---------------------+
Now we want to see duplicate records
Use this query:
select student_name,student_id ,count(*) c from student group by student_id,student_name having c>1;
+--------------------+------------+---+
| student_name | student_id | c |
+---------------------+------------+---+
| usman | 101 | 3 |
| muhammadusmanyaqoob | 103 | 2 |
+---------------------+------------+---+
SELECT *
FROM (SELECT address, COUNT(id) AS cnt
FROM list
GROUP BY address
HAVING ( COUNT(id) > 1 ))
SELECT date FROM logs group by date having count(*) >= 2
SELECT t.*,(select count(*) from city as tt where tt.name=t.name) as count FROM `city` as t where (select count(*) from city as tt where tt.name=t.name) > 1 order by count desc
Ersetzen Sie die Stadt durch Ihre Tabelle. Ersetzen Sie den Namen durch Ihren Feldnamen
select `cityname` from `codcities` group by `cityname` having count(*)>=2
Dies ist die ähnliche Abfrage, nach der Sie gefragt haben und deren 200% funktionieren und einfach sind. Genießen!!!