【问题标题】:Removing duplicate rows that also have equal values in n-th column删除在第 n 列中也具有相同值的重复行
【发布时间】:2012-07-31 15:35:19
【问题描述】:

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

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

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

如何使用mysql做到这一点?

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

DELETE

从自动 WHERE ((auto.email='carolzvalentine@yahoo.com') AND (auto.vendors='5552'))

【问题讨论】:

  • 你尝试过什么吗??向我们展示你的努力......
  • "CREATE TABLE new_table as SELECT * FROM auto WHERE CHAR_LENGTH(vendor) > 1 GROUP BY vendor";
  • 你必须在你的问题中表现出你的努力,所以如果你把上面的查询写在你的问题中作为你的努力会更好......

标签: mysql database


【解决方案1】:

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

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

如the manual中所述:

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

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

【讨论】:

  • 谢谢,但我不想防止出现重复。我只想在我决定时能够清除重复项。他们是按照我的标准做到这一点的方法吗?
  • @SofianeMerah:正如我所说,创建索引然后删除它。
  • 创建索引。然后放下它。这会做什么?我不明白这里的操作。你能给我一个例子吗?谢谢。
  • @SofianeMerah:您是否阅读了我从 MySQL 手册中引用的解释 IGNORE 关键字的段落?
  • 是的,我有,我在写这篇文章时正在阅读手册。我敢肯定,如果我对这些功能有更多了解,我会自己做,但我不知道,所以我现在不知道发生了什么。您能否提供上下文、示例和操作顺序。谢谢。
【解决方案2】:
"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 分钟即可完成任务。

干杯

【讨论】:

  • 有谁知道如何更快地做到这一点?
猜你喜欢
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2017-11-07
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
相关资源
最近更新 更多