2012-01-18 12 views
6

Ho una tabella:eliminare selettivamente in gran parte duplicare record da MySQL

PRICE_UPDATE 
id (int 5, auto-increment, primary, unique) 
part_number (varchar 10, non-null) 
price (float(10,2), non-null) 

Alcune delle part_number s sono duplicati (1 o più record duplicati). A volte con lo stesso prezzo, a volte con prezzi diversi.

Come posso eliminare tutte le righe duplicate basate su numero_part, lasciando il prezzo più alto o solo 1 record se i prezzi erano tutti uguali?

Ciò è possibile anche in MySQL diretto?

risposta

12
DELETE t1 
    FROM YourTable t1, YourTable t2 
    WHERE t1.part_number = t2.part_number 
     AND (t1.price, t1.id) < (t2.price, t2.id) 
+3

Anche l'OP voleva eliminarli se il prezzo era lo stesso (lasciando uno, ovviamente). – jprofitt

+3

Questo è quasi ciò che vuole il manifesto - tranne che se il prezzo più alto per un numero di parte è duplicato, allora la tua query lascerà tutti. Vorrei aggiungere 'o (t1.price = t2.price e t1.id

+1

@jprofitt: Buona cattura. Ho modificato la mia risposta. –

2

Dall'interno all'esterno:

  1. seleziona i ids con il prezzo max per NUMERO_ARTICOLO
  2. Seleziona l'ID massimo con il prezzo max per NUMERO_ARTICOLO
  3. di eliminare i ids non presenti in 2.

delete tablename where id not in (
(select max(id) from tablename a 
inner join 
    (select id, max(price) 
    from tablename 
    group by part_number) b on a.id = b.id and a.price = b.price 
group by part_number)) 
Problemi correlati