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?

2voto

Wenn Sie Duplikate entfernen möchten, verwenden Sie DISTINCT

Andernfalls verwenden Sie diese Abfrage:

SELECT users.*,COUNT(user_ID) as user FROM users GROUP BY user_name HAVING user > 1;

2voto

Pawel Furmaniak Punkte 4264
SELECT DISTINCT a.email FROM `users` a LEFT JOIN `users` b ON a.email = b.email WHERE a.id != b.id;

1voto

fortyninthnet Punkte 11

Ein sehr später Beitrag... falls er jemandem gaaaaanz weit unten hilft... Ich hatte die Aufgabe, übereinstimmende Transaktionspaare (eigentlich beide Seiten von Konto-zu-Konto-Überweisungen) in einer Banking-App zu finden, um herauszufinden, welche die "von"- und die "nach"-Transaktion für jede Inter-Account-Transfer-Transaktion waren, und so kamen wir zu diesem Ergebnis:

SELECT 
    LEAST(primaryid, secondaryid) AS transactionid1,
    GREATEST(primaryid, secondaryid) AS transactionid2
FROM (
    SELECT table1.transactionid AS primaryid, 
        table2.transactionid AS secondaryid
    FROM financial_transactions table1
    INNER JOIN financial_transactions table2 
    ON table1.accountid = table2.accountid
    AND table1.transactionid <> table2.transactionid 
    AND table1.transactiondate = table2.transactiondate
    AND table1.sourceref = table2.destinationref
    AND table1.amount = (0 - table2.amount)
) AS DuplicateResultsTable
GROUP BY transactionid1
ORDER BY transactionid1;

Das Ergebnis ist, dass die DuplicateResultsTable liefert Zeilen mit übereinstimmenden (d.h. doppelten) Transaktionen, aber es liefert auch dieselben Transaktions-IDs in umgekehrter Reihenfolge, wenn es das gleiche Paar zum zweiten Mal findet, so dass die äußere SELECT ist dazu da, nach der ersten Transaktions-ID zu gruppieren, was durch die Verwendung von LEAST y GREATEST um sicherzustellen, dass die beiden Transaktions-IDs in den Ergebnissen immer in der gleichen Reihenfolge stehen, so dass es sicher ist, dass GROUP durch die erste, wodurch alle doppelten Treffer eliminiert werden. Ich habe fast eine Million Datensätze durchsucht und mehr als 12.000 Übereinstimmungen in weniger als 2 Sekunden gefunden. Natürlich ist die transactionid der primäre Index, was sehr hilfreich war.

1voto

Um doppelte Zeilen mit mehreren Feldern zu entfernen, stornieren Sie sie zunächst mit dem neuen eindeutigen Schlüssel, der für die einzigen eindeutigen Zeilen angegeben ist, und verwenden Sie dann den Befehl "Gruppieren nach", um doppelte Zeilen mit demselben neuen eindeutigen Schlüssel zu entfernen:

Create TEMPORARY table tmp select concat(f1,f2) as cfs,t1.* from mytable as t1;
Create index x_tmp_cfs on tmp(cfs);
Create table unduptable select f1,f2,... from tmp group by cfs;

1voto

Atul Akabari Punkte 93

Versuchen Sie es mit dieser Abfrage:

SELECT name, COUNT(*) value_count FROM company_master GROUP BY name HAVING value_count > 1;

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