删除在第n列中也具有相同值的重复行

时间:2012-07-31 15:35:19

标签: mysql database

我有一个mysql表。标题的结构如下:

字段字段字段字段厂商
数据数据数据数据数据
数据数据数据数据数据
数据数据数据数据DATA2
数据数据数据数据DATA2
数据数据数据数据DATA2

现在,我想删除共享相同供应商值的重复行的行。因此,两行相同但具有不同供应商列值的行不应视为重复。但是,两个或多个相等且共享相同供应商值的行将被视为重复,应删除,只留下一个现有副本。

如何使用mysql完成?

我做了类似这样的事情,但它删除了所有内容,而不仅仅是重复的值。我想要至少剩下一份副本。

DELETE

FROM auto WHERE((auto.email='carolzvalentine@yahoo.com')AND(auto.vendors ='5552'))

2 个答案:

答案 0 :(得分:1)

您可以使用UNIQUE在表格列上添加ALTER IGNORE索引:

ALTER IGNORE TABLE mytbl ADD UNIQUE INDEX (field1, field2, field3, field4, vendors)

the manual中所述:

  

IGNORE是标准SQL的MySQL扩展。如果新表中的唯一键上有重复项,或者如果启用了严格模式时出现警告,它将控制ALTER TABLE的工作方式。如果未指定IGNORE,则复制将中止并在发生重复键错误时回滚。如果指定了IGNORE,则只对第一行使用唯一键上具有重复项的行。其他冲突的行将被删除。不正确的值将被截断为最接近的匹配可接受值。

这也可以防止将来添加重复项(如果你想允许这样做,你可以在创建索引后DROP)。

答案 1 :(得分:0)

"DELETE x
 FROM $table x
 LEFT
 JOIN
 ( SELECT vendors
        , email
        , MIN(lead_id) min_lead_id
     FROM $table
    GROUP
       BY vendors
        , email
 ) y
ON y.vendors = x.vendors
AND y.email = x.email
AND y.min_lead_id = x.lead_id
WHERE x.vendors = $vendor
AND y.min_lead_id IS NULL;";

这样做。只需用正确的值替换该代码中的php变量即可。

  

$ vendor =供应商列的名称
$ table =表的名称

此代码的唯一问题是它不是完全最优的。设置了25,000个记录并在虚拟专用服务器中运行,它平均完成任务2分钟。

干杯