Сегодня была задача: удалить дубликаты характеристик в товаре на CMS PrestaShop.
Как это сделать, смотрите ниже, но сначала лучше сделаем выборку и проверим, что выводит правильно:
SELECT * FROM `prstshp_feature_product`
INNER JOIN (SELECT min(id_feature_value) minid, id_feature, id_product
FROM prstshp_feature_product
GROUP BY id_feature, id_product HAVING count(1) > 1
) AS duplicates ON
( duplicates.id_feature = prstshp_feature_product.id_feature
AND duplicates.id_product = prstshp_feature_product.id_product
AND duplicates.minid <> prstshp_feature_product.id_feature_value
)
Коротко поясню, что где указано:
prstshp_feature_product - название таблицы, в которой ищем дубликаты
min(id_feature_value) - для меня это минимальное значение характеристики товара, для вас может быть поле id записи
INNER JOIN - выведем таблицу справа, чтобы сравнить и выполнить подзапрос на дубликат, запросу дадим имя через "AS" duplicates
id_feature, id_product - это поля в таблице, по которым нужно найти дубликаты
В конструкции INNER JOIN, пишем наше условие в ON(..), где сначала указываем, предполагаемые равные поля, а в конце сравниваем "<>" id дубликатов и основного запроса, в моем случае это id_feature_value.
Выполняем сначала SELECT для сверки, а потом уже можно и удалить записи. Где SELECT * FROM меняем на DELETE [название основного запроса, в моем случае название таблицы] FROM:
DELETE prstshp_feature_product FROM `prstshp_feature_product`
INNER JOIN (SELECT min(id_feature_value) minid, id_feature, id_product
FROM prstshp_feature_product
GROUP BY id_feature, id_product HAVING count(1) > 1
) AS duplicates ON
( duplicates.id_feature = prstshp_feature_product.id_feature
AND duplicates.id_product = prstshp_feature_product.id_product
AND duplicates.minid <> prstshp_feature_product.id_feature_value
)