1

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

字段字段字段字段供应商
数据数据数据数据数据数据数据数据数据数据数据数据数据数据数据数据数据数据数据数据数据数据数据数据数据数据数据
数据数据数据数据
数据
数据
数据数据2

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

使用mysql如何做到这一点?

我做了这样的事情,但它删除了所有内容,而不仅仅是重复的值。我希望至少还剩一份。

DELETE

从汽车到哪里((auto.email='carolzvalentine@yahoo.com')和(auto.vendors='5552'))

4

2 回答 2

1

您可以使用以下UNIQUE方法在表的列上添加索引ALTER IGNORE

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

手册中所述

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

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

于 2012-07-31T15:45:19.123 回答
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 分钟即可完成任务。

干杯

于 2012-08-05T16:37:07.627 回答