945 Stimmen

Suche nach doppelten Werten in MySQL

Ich habe eine Tabelle mit einer varchar-Spalte und möchte alle Datensätze finden, die doppelte Werte in dieser Spalte haben. Was ist die beste Abfrage, die ich verwenden kann, um die Duplikate zu finden?

1809voto

levik Punkte 108445

Machen Sie eine SELECT mit einer GROUP BY Klausel. Sagen wir Name ist die Spalte, in der Sie nach Duplikaten suchen wollen:

SELECT name, COUNT(*) c FROM table GROUP BY name HAVING c > 1;

Dies liefert ein Ergebnis mit dem Name Wert in der ersten Spalte und eine Zählung, wie oft dieser Wert in der zweiten Spalte erscheint.

292voto

maxyfc Punkte 10827
SELECT varchar_col
FROM table
GROUP BY varchar_col
HAVING COUNT(*) > 1;

240voto

Quassnoi Punkte 396418
SELECT  *
FROM    mytable mto
WHERE   EXISTS
        (
        SELECT  1
        FROM    mytable mti
        WHERE   mti.varchar_column = mto.varchar_column
        LIMIT 1, 1
        )

Diese Abfrage gibt vollständige Datensätze zurück, nicht nur eindeutige varchar_column 's.

Diese Abfrage verwendet nicht COUNT(*) . Wenn es viele Duplikate gibt, COUNT(*) ist teuer, und Sie brauchen nicht die ganze COUNT(*) Sie müssen nur wissen, ob es zwei Zeilen mit demselben Wert gibt.

Dies wird erreicht durch die LIMIT 1, 1 am Ende der korrelierten Abfrage (was im Wesentlichen bedeutet: "Gib die zweite Zeile zurück"). EXISTS würde nur dann true zurückgeben, wenn die besagte zweite Zeile existiert (d. h. es gibt mindestens zwei Zeilen mit demselben Wert der varchar_column).

Mit einem Index auf varchar_column wird diese Abfrage natürlich erheblich beschleunigen.

189voto

Matt R. Punkte 2019

Aufbauend auf leviks Antwort, um die IDs der doppelten Zeilen zu erhalten, können Sie eine GROUP_CONCAT wenn Ihr Server dies unterstützt (es wird eine durch Kommata getrennte Liste von IDs zurückgegeben).

SELECT GROUP_CONCAT(id), name, COUNT(*) c
FROM documents
GROUP BY name
HAVING c > 1;

25voto

udi Punkte 221

Um alle Daten zu erhalten, die Duplikate enthalten, habe ich dies verwendet:

SELECT * FROM TableName INNER JOIN(
  SELECT DupliactedData FROM TableName GROUP BY DupliactedData HAVING COUNT(DupliactedData) > 1 order by DupliactedData)
  temp ON TableName.DupliactedData = temp.DupliactedData;

Tabellenname = die Tabelle, mit der Sie arbeiten.

DupliactedData = die doppelten Daten, nach denen Sie suchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X