匹配部分重复的行(并删除除最旧的行之外的所有行)

时间:2015-09-07 08:05:41

标签: php mysql

我使用电子邮件自动回复软件将联系人(即人,姓名,电子邮件地址等)分配给自动回复(即他们订阅的邮件序列)。

碰巧有些人订阅了两次相同的自动回复。

然后表格如下:

id    contact_id    autoresponder_id    stamp_subscribe    other_stuff
1     1             5                   1430400000         slkdfj
2     2             5                   1430402085         oweuoe
3     1             5                   1430402085         iclksls

我正在尝试找到一个MySQL查询...

  1. 匹配将相同contact_id分配给autoresponder_id =“5”两次或更多次的所有条目,忽略所有other_stuff(在示例中:行ID 1和ID 3)

  2. 在为任何contact_id找到的所有内容中,删除除最旧版本之外的所有内容(即具有最低stamp_subscribe值的内容;在示例中:行ID 3将被删除,保留行ID为1的旧条目)< / p>

1 个答案:

答案 0 :(得分:0)

我会使用子查询来查找contact_id / autoresponder_id的所有第一条记录,并将该子查询与LEFT OUTER JOIN连接到主表。然后删除没有匹配记录的所有行。

DELETE a
FROM sometable a
LEFT OUTER JOIN
(
    SELECT id
    FROM
    (
        SELECT contact_id, autoresponder_id, MIN(id) AS id
        FROM sometable
        GROUP BY contact_id, autoresponder_id
    ) sub0
) b
ON a.id = b.id
WHERE b.id IS NULL

请注意,这样的删除会让我非常紧张,因为可能会出现轻微错误导致大量数据被删除。