Mysql удаление дублей в таблице
Категория: / DEV Блог
/ PHP (LAMP)
Имеем таблицу с торговыми предложениями
Необходимо удалить все дубликаты для продуктов с разницей в день. В итоге должно получиться: один день - одно предложение.
Например, по продукту #1 за первое апреля находится 3 записи, значит нужно удалить две первые.
Запрос поиска дублей:
Для удаления, необходимо `SELECT` заменить на `DELETE offers FROM`.
@tags: sql, mysql, duplicates
CREATE TABLE IF NOT EXISTS `offers` (
`id` int(10) unsigned NOT NULL,
`product_id` int(10) unsigned NOT NULL,
`value` decimal(10,0) NOT NULL,
`discount` tinyint(4) NOT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
);
Необходимо удалить все дубликаты для продуктов с разницей в день. В итоге должно получиться: один день - одно предложение.
Например, по продукту #1 за первое апреля находится 3 записи, значит нужно удалить две первые.
SELECT * FROM `offers` WHERE product_id = 1 AND date(created_at) = '2013-04-01'
id product_id value discount created_at
196 1 3599 0 2013-04-01 00:00:00
218 1 3599 0 2013-04-01 03:00:00
244 1 3599 0 2013-04-01 15:00:00
Запрос поиска дублей:
SELECT offers.*, dup.* FROM offers
INNER JOIN (
SELECT max(id) maxid, product_id, date(created_at) created_atd, count(*) cnt FROM `offers`
WHERE product_id = 1
GROUP BY product_id, created_atd
HAVING cnt > 1
) dup ON offers.product_id = dup.product_id AND date(offers.created_at) = dup.created_atd
WHERE offers.id < dup.maxid
id pr_id value dis maxid pr_id created_atd cnt
1 1 3599 0 42 1 2013-03-29 3
22 1 3599 0 42 1 2013-03-29 3
64 1 3599 0 108 1 2013-03-30 3
86 1 3599 0 108 1 2013-03-30 3
130 1 3419 5 174 1 2013-03-31 3
152 1 3419 5 174 1 2013-03-31 3
196 1 3599 0 244 1 2013-04-01 3
218 1 3599 0 244 1 2013-04-01 3
267 1 3599 0 337 1 2013-04-02 3
Для удаления, необходимо `SELECT` заменить на `DELETE offers FROM`.
@tags: sql, mysql, duplicates