2012-01-18 13 views
6

Tengo una tabla:selectivamente el borrado mayormente registros duplicados de MySQL

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

Algunos de los part_number s están duplicados (1 o más registros duplicados). A veces con el mismo precio, a veces con precios diferentes.

¿Cómo puedo eliminar todas las filas duplicadas en función de part_number, dejando el precio más alto o solo 1 registro si los precios son todos iguales?

¿Esto es posible incluso en MySQL directo?

Respuesta

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

El OP también quería eliminarlos si el precio era el mismo (dejando uno, por supuesto). – jprofitt

+3

Esto es casi lo que quiere el póster, excepto que si el precio más alto para un número de parte está duplicado, su consulta los dejará a todos. Agregaría 'o (t1.price = t2.price y t1.id

+1

@jprofitt: Buena captura. Ajusté mi respuesta. –

2

Desde el interior, hacia el exterior:

  1. Selecciona los identificadores con el precio máximo por part_number
  2. selecciona el ID máximo con el precio máximo por part_number
  3. elimina los identificadores que no disponga la 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)) 
Cuestiones relacionadas