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:

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!!!





duplicates