1

我是一名Web开发人员,因此我缺乏操纵海量数据的知识。在mysql中删除多行重复的数据?

的同事,被寻找一个解决方案给我们的数据的问题。我们有一张约40万行的表格,列出了公司名称。

谁设计了这个没有意识到是某种对于一个公司唯一标识符有需要,所以有公司名称的重复条目。

什么方法会为所有这些记录了匹配基础上的公司名称,并删除基于某种标准(另一列)

我想编写一个脚本来做到这一点的重复使用一次在PHP中,但我真的很难相信,我的脚本将能够执行的同时在这么多行之间进行比较。有什么建议?

回答

0

答案: Answer origin

1)从表1中删除

2)使用表1,表1如虚表

3)WHERE(NOT table1.ID> vtable.ID)

4)和(table1.field_name = vtable.field_name)

  1. 这里你告诉mysql有一个table1。
  2. 然后你告诉它你将使用table1和一个带有table1值的虚拟表。
  3. 这将让MySQL不会比较自己的记录!
  4. 在这里你告诉它,不应该有相同的field_name的记录。
+0

这似乎是 – user1214633 2012-03-22 18:00:00

+0

我做了第一个版本的一种最聪明的解决方案: WHERE(NOT table1.ID = vtable.ID) 将删除所有重复没有留下任何落后。 修改为: WHERE(NOT table1.ID> vtable.ID) – 2012-03-22 18:02:25

0

我过去做过这个的方式是编写一个查询,只返回我想要的集合(通常使用DISTINCT +子查询来确定基于其他值的正确记录),并将其插入到不同的值中表。然后,您可以删除旧表并将新名称重命名为旧名称。

+0

这是一个伟大的想法,但我会子查询能够使以确定这是我选择的行之间的比较?我想即使订购它们(从col中取得最高值)也可能有所帮助..你可以写一个小代码示例吗? – user1214633 2012-03-22 17:54:20

0

要找到企业的名单,在你的表副本,您可以使用脚本那样:

SELECT NAME 
FROM companies 
GROUP BY NAME 
HAVING COUNT(*) > 1 

而且下面将删除除col列包含最大值所有重复

DELETE del 
FROM companies AS del 
INNER JOIN (
    SELECT NAME, MAX(col) AS col 
    FROM companies 
    GROUP BY NAME 
    HAVING COUNT(*) > 1 
) AS sub 
    ON del.NAME = sub.NAME AND del.col <> sub.col