2017-02-11 4 views
1

Ich habe die folgende Datenbank und möchte die roten löschen, weil sie zweifach sind. Also muss ich jede Zeile überprüfen, wenn eine andere Zeile mit pid, price, price_old, link und shop übereinstimmt.SQL: Doppelte Zeilen löschen? (PHP)

Aber wie kann ich das überprüfen und wie kann ich es dann löschen?

enter image description here

Vielleicht ein einfacher Weg, um eine ID von den Werten in jeder Zeile zu erzeugen wäre. Wenn also die Werte innerhalb einer Zeile gleich wären, wäre auch die ID gleich und wer hätte nur einen Wert, um mit den anderen IDs zu vergleichen. Ist das ein besserer Weg? - Wenn ja, wie kann ich das tun?

Grüße!

Antwort

1

Sie die Tatsache, dass Sie keine Möglichkeit haben, für thi deutliche Reihe erhalten Sie uniqie id mit

ALTER TABLE my_table 
ADD id int NOT NULL AUTO_INCREMENT 

das erledigt man konnte sie nicht benutzt, wo die ID sind nicht die min durch den Wert, den Sie benötigen gruppiert könnte hinzufügen definieren die Duplizierung

delete from my_table 
where id NOT in (select min(id) from my_table 
        group by shop, link 
       ) 
+0

Ich habe noch keine ID ... Wie konnte ich mir eine ID aus den Werten generieren lassen - pid, price, price_old, link und shop? – Jan

+0

Ich habe die asnwer mit ID-Generation zu aktualisieren – scaisEdge

0

Der einfachste Weg, um eine distinct Abfrage auszuführen ist:

select distinct pid, price, price_old, link, shop 
from t; 

Sie können eine neue Tabelle mit into erstellen. Das ist der einfachste Weg. Da alle Spalten identisch sind, bietet MySQL keine einfache Methode zum Löschen doppelter Zeilen (wobei eine davon übrig bleibt).

Es ist jedoch möglich, dass Ihre aktuellen Ergebnisse durch eine Abfrage generiert werden. Wenn ja, können Sie einfach select distinct zu der Abfrage hinzufügen. Es wäre jedoch besser, die Abfrage zu korrigieren, damit keine Duplikate generiert werden. Wenn dies der Fall ist, fragen Sie eine weitere Frage mit Beispieldaten, gewünschte Ergebnisse (als Text, kein Bild) und die Abfrage, die Sie gerade verwenden.

+0

Nein, es kommt nicht von einer Abfrage. Ich habe einen Cronjob, der alle 24 Stunden läuft. Aber mein Problem ist, dass dieser Cronjob die neuen Daten hinzufügen würde und einige Werte werden immer noch die gleichen wie im Cronjob sein, aber einige Werte werden anders sein als im Cronjob zuvor. So ist meine einzige Möglichkeit, alle duplizierten Zeilen zu löschen, während eine von ihnen verlassen. – Jan

+0

@Jan. . .Sie sollten den Cron-Job reparieren, damit er keine doppelten Werte einfügt. Darüber hinaus sollte jede Zeile (mindestens) eine eindeutige ID (automatisch inkrementiert) und ein Erstellungsdatum/eine Erstellungszeit haben. –

0

-Test dieses zuerst auf einem Testtabelle:

DELETE t1 
FROM t t1, t t2 
WHERE t1.id > t2.id AND t1.price = t2.price 
    AND t1.link = t2.link AND t1.shop = t2.shop 
    AND t1.price_old = t2.price_old; 

Grundsätzlich Sie das mit der höchsten ID werden zu entfernen, wenn diese Parameter zuerst gleich

0
select * from 
(select pid, price, price_old, link , 
row_number() over(partition by pid, price, price_old, link, shop order by pid) as rank 
from my_table) temp 
where temp.rank = 1 

Diese Abfrage wird Gruppe von allen Spalten sind und ordnet sie ein. Doppelte Zeilen haben den Rang> 1. Es spielt keine Rolle, ob wir die erste oder die zweite Zeile nehmen, da beide Kopien voneinander sind. Wir nehmen nur Zeilen mit Rang 1. Zeilen, die nicht dupliziert sind, haben ebenfalls Rang 1 und werden daher nicht vernachlässigt.

Ein weiterer Weg dazu ist die Verwendung von Union.

select * from my_table UNION select * from my_table