Mysql удаление дублей в таблице

Категория: / DEV Блог / PHP (LAMP)
Имеем таблицу с торговыми предложениями

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