2017-04-21 4 views
2

Ich habe eine beliebig große MySQL-Tabelle, in der es doppelte Zeilen gibt. Um jedoch zu bestimmen, welche Zeilen dupliziert werden, muss ich die Daten aus zwei Spalten abgleichen. Ein modifiziertes Snippet der Tabelle ist unten.MySQL - Suchen von doppelten Daten aus zwei Spalten

mysql> select * from DATA_STATUS where METADATA_ID='6ac00785-abcd-3f4a-defg-12b8ed23abff'; 
+--------+------------+--------------------------------------+-------------+ 
| ID  | STATUS  | METADATA_ID       | METADATA_FK | 
+--------+------------+--------------------------------------+-------------+ 
| 1  |   3 | 6ac00785-abcd-3f4a-defg-12b8ed23abff |  1234 | 
+--------+------------+--------------------------------------+-------------+ 
| 2  |   3 | 6ac00785-abcd-3f4a-defg-12b8ed23abff |  1234 | 
+--------+------------+--------------------------------------+-------------+ 
| 3  |   0 | 6ac00785-abcd-3f4a-defg-12b8ed23abff |  1234 | 
+--------+------------+--------------------------------------+-------------+ 
| 4  |   0 | 6ac00785-abcd-3f4a-defg-12b8ed23abff |  1234 | 
+--------+------------+--------------------------------------+-------------+ 
| 5  |   1 | 6ac00785-abcd-3f4a-defg-12b8ed23abff |  1234 | 
+--------+------------+--------------------------------------+-------------+ 
| 6  |   2 | 6ac00785-abcd-3f4a-defg-12b8ed23abff |  1234 | 
+--------+------------+--------------------------------------+-------------+ 

Ich mag eine Auswahl auf der gesamte Tabelle zu tun, wo es mehr von den gleichen METADATA_ID ist, wo die dupliziert METADATA_ID Reihen ein STATUS von 3. haben ich weiß, wie man eine Tabelle in einer Spalte für Duplikate abzufragen, aber Ich habe Mühe, herauszufinden, wie man auf Duplikate und andere Bedingungen abgleicht.

Aus den Beispieldaten, die Zeilen-IDs, die diese Bedingung erfüllen sind 1 und 2, aber nicht 3.


EDIT: Weitere Informationen zur Klärung und TL; DR Bedingungen

Das übergeordnete Kriterien für ein Duplikat ist STATUS=3 und METADATA_ID > 1, das folgende Snippet zeigt die Zeilen, die dies erfüllen.

+--------+------------+--------------------------------------+-------------+ 
| ID  | STATUS  | METADATA_ID       | METADATA_FK | 
+--------+------------+--------------------------------------+-------------+ 
| 1  |   3 | 6ac00785-abcd-3f4a-defg-12b8ed23abff |  1234 | 
+--------+------------+--------------------------------------+-------------+ 
| 2  |   3 | 6ac00785-abcd-3f4a-defg-12b8ed23abff |  1234 | 
+--------+------------+--------------------------------------+-------------+ 

mag ich die Abfrage entweder zurück ziehen nur eine Zeile, die die ID, STATUS und METADATA_ID enthält (METADATA_FK ist optional), wenn ein Duplikat gefunden wird oder alle Instanzen der Vervielfältigung, entweder ist in Ordnung. Die Daten werden nicht doppelt gezählt, wenn STATUS nicht 3 ist oder METADATA_ID nur einmal in der Tabelle vorhanden ist.

Antwort

1

Versuchen Sie folgendes:

select * 
from yourtable 
where 
    status_id = 3 and 
    metadata_id in (
     select metadata_id 
     from yourtable 
     where status_id = 3 
     group by metadata_id 
     having count(*) > 1 
); 

Working example

Wenn nicht alle Zeilen erforderlich sind, können Sie diese einfache Abfrage verwenden:

select * from yourtable where status_id = 3 group by metadata_id having count(*) > 1; 
+1

Danke. Ich habe die vorherige Antwort und die aktualisierte Antwort auf der tatsächlichen Tabelle versucht. Die erste Abfrage funktionierte wie erwartet, die aktualisierte jedoch nicht. Es sieht so aus, als würde es nicht nach doppelten 'metadata_id' Werten suchen. – Donglecow

+0

Der zweite ruft alle Zeilen ab, die Duplikate sind (Zeile 1 und Zeile 2), weil ich dachte, dass Sie gefragt haben. Vielleicht habe ich die Frage nicht bekommen, können Sie eine Beispielausgabe von der Eingabe bereitstellen, die Sie zur Verfügung gestellt haben? –

+0

Sicher. Ich werde die Frage bearbeiten, um dies zu verdeutlichen, und weitere Zeilen hinzufügen, um weiter zu helfen. – Donglecow

1

Unter der Annahme, alle Datensätze, die Sie wollen, die diese Felder dupliziert : -

SELECT some_table.ID, 
     some_table.STATUS, 
     some_table.METADATA_ID, 
     some_table.METADATA_FK 
FROM 
(
    SELECT STATUS, 
     METADATA_ID, 
     METADATA_FK 
    FROM some_table 
    WHERE status_id = 3 
    GROUP BY STATUS, METADATA_ID, METADATA_FK 
    HAVING COUNT(*) > 1 
) sub0 
INNER JOIN some_table 
ON sub0.STATUS = some_table.STATUS 
AND sub0.METADATA_ID = some_table.METADATA_ID 
AND sub0.METADATA_FK = some_table.METADATA_FK 

Ich habe angenommen, dass metafata_fk Teil der Einzigartigkeit eines Datensatzes ist

+0

Vielen Dank. Ich kann keine Änderung vorschlagen, aber mein MySQL-Client hat wegen des Kommas in der Zeile 'ON sub0.STATUS = some_table.STATUS,' einen Fehler ausgegeben.Darüber hinaus lief die Abfrage durch, es scheint jedoch nicht nach einem "STATUS" von 3 zu suchen, was eine Bedingung zum Identifizieren der Duplikate ist. – Donglecow

+1

Erledigt die kleinen Korrekturen für diese. – Kickstart

Verwandte Themen