2017-09-21 2 views
1

Ich habe eine MySQL-Tabelle mit jeder Zeile mit 20 Feldern. Unter anderem hat:Wie behalte ich eine Zeile und entferne Duplikate in mysql?

table: origin, destination, date, price

Jetzt möchte ich alle Zeilen zu entfernen, die doppelte sind in Bezug auf nur einen Satz von bestimmten Bereichen: origin, destination, date.

Ich habe versucht:

delete from mytable where id not in 
    (select id from (
      SELECT MAX(p.id) as id from mytable p group by p.origin, p.destination, p.date 
    ) x) 

Problem: diese Zeilen mit den höchsten id behält (Mittel: zuletzt hinzugefügten).

Stattdessen möchte ich nur die Zeile behalten, die den niedrigsten Preis hat. Aber wie?

Hinweis: Ich kann keinen eindeutigen Index hinzufügen, da die Tabelle für Masseneinfügungen von LOAD DATA verwendet wird und keine Fehler ausgegeben werden sollten. Zum Zeitpunkt der Belastung weiß ich nicht, welche Zeile der "Bestpreis" ist.

Auch würde ich keine zusätzlichen oder temporären Tabellen einführen wollen, die eins zu anderem kopieren. Ändern Sie einfach die vorhandene Tabelle.

Antwort

1

Self-Join-Lösung:

delete t1 
from yourtable t1 
join yourtable t2 
on t1.origin = t2.origin 
and t1.destination = t2.destination 
and t1.date = t2.date 
and t1.price > t2.price 
+0

Gibt es einen Unterschied zu 'select * from yourtable a, b WHERE ... yourtable', dann ist dies genau das gleiche? – membersound

+0

Und wichtiger: Was ist, wenn "t1.price = t2.price"? Dann würden beide Zeilen behalten, aber ich würde immer noch einen von ihnen entfernen wollen. Könnte ich besser machen als die Einträge mit kleinerer ID zu entfernen? '... und (t1.price> t2.price ODER (t1.price = t2.price UND t1.id membersound

+1

@membersound Tabellen mit Komma zu verbinden ist eine alte Methode, aber natürlich hier , es hat das gleiche Ergebnis zwischen 'inner join' mit', '. – Blank

0
delete t1 
from mytable t1 
left join 
(
    SELECT origin, destination, date, min(price) as price 
    from mytable 
    group by origin, destination, date 
) t2 on t1.origin = t2.origin 
    and t1.destination = t2.destination 
    and t1.date = t2.date 
    and t1.price = t2.price 
where t2.origin is null 
Verwandte Themen