我有一个mysql表。标题的结构如下:
字段字段字段字段厂商
数据数据数据数据数据
数据数据数据数据数据
数据数据数据数据DATA2
数据数据数据数据DATA2
数据数据数据数据DATA2
现在,我想删除共享相同供应商值的重复行的行。因此,两行相同但具有不同供应商列值的行不应视为重复。但是,两个或多个相等且共享相同供应商值的行将被视为重复,应删除,只留下一个现有副本。
如何使用mysql完成?
我做了类似这样的事情,但它删除了所有内容,而不仅仅是重复的值。我想要至少剩下一份副本。
DELETE
FROM auto WHERE((auto.email='carolzvalentine@yahoo.com')AND(auto.vendors ='5552'))
答案 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分钟。
干杯