2016-02-13 1 views
0

У меня есть много повторяющихся продуктов, которые мне нужно удалить. Есть ли запрос удалить эти «Дубликаты» с «более низкой ценой» и/или «Одинаковая цена», чтобы сохранить только 1 каждого продукта?Удалите дублированный продукт с более низкой ценой с помощью запроса mysql

Дубликаты имеют дубликат «Имя продукта» Я использую OpenCart версии 2.1.0.1

+0

Укажите схему таблицы (поля, ключи и т. Д.). Без этого трудно дать вам решение. – Nicarus

+2

Возможно дублируется с вопросом [http://stackoverflow.com/questions/18932/how-can-i-remove-duplicate-rows](http://stackoverflow.com/questions/18932/how-can-i-remove -duplicate-rows) – RafaelCaballero

ответ

0

Согласно схеме на http://wiki.opencarthelp.com/doku.php?id=databse_schema и только на одном языке на следующие запрос должен решить проблему:

delete p1 
from product p1 
join product_description d1 on d1.product_id = p1.product_id 
join product_description d2 
    on d2.product_id <> d1.product_id 
    and d2.language_id = d1.language_id 
    and d2.name = d1.name 
join product p2 on p2.product_id = d2.product_id 
where d1.language_id = 1 -- define the language used for product name 
    and (p2.price > p1.price -- delete if higher price exists 
    or p2.price = p1.price and p2.product_id < p1.product_id -- delete if same price with lower id exists 
) 
; 
0

Без много информации (который RDBMS, и т.д.), я могу только предположить, это решение будет работать для вас:

WITH Flagged AS 
(
SELECT 
    ProductName, 
    CASE WHEN ROW_NUMBER() OVER(PARTITION BY ProductName ORDER BY Price DESC) = 1 THEN 0 ELSE 1 END AS Delete 
FROM 
    Products 
) 

DELETE p 
FROM Products p 
JOIN Flagged f 
ON (p.ProductName = f.ProductName) 
WHERE f.Delete = 1; 
1

Поскольку вы используете MySQL, вам нужно использовать объединения (раздела, не поддерживается):

выберите:

select p.* 
from products as p 
join 
(
    select name, min(price) as price 
    from products group by name having count(price) = 2 
) as p2 on p2.name = p.name and p2.price = p.price; 

Получает самую низкую цену для всех повторяющихся продуктов (где дубликат предполагает наличие ровно двух строк одного и того же продукта).

Чтобы удалить, изменить первоначальный выбор на удаление, следующим образом:

delete p.* 
from products as p 
join 
(
    select name, min(price) as price 
    from products group by name having count(price) = 2 
) as p2 on p2.name = p.name and p2.price = p.price; 
+0

Вы можете «отменить» это и получить MAX вместо MIN. Затем удалите только те, которые не MAX. Это будет обрабатывать случаи, когда есть три раза и т. Д. – Nicarus

+0

Вышеприведенный запрос будет работать с дубликатами, которые имеют одинаковую цену или другую цену. Используя max и присоединяясь снова и снова к одному имени и обязательно к другой цене для соединения/удаления, чтобы сохранить набор хороших значений из «обратного» запроса, запрос больше не удаляет удаленные дубликаты (или кратность), которые имеют одинаковую цену. –