【问题标题】:mysql deleting duplicates from tablemysql从表中删除重复项
【发布时间】:2016-01-02 17:12:04
【问题描述】:

我可以通过以下方式找到重复项:

select id,date,count(*) as rep,comment
     from New_opinion group by comment,
     Date,company_id having rep>1;

我相信这给了我一组重复项中的一条记录,这些记录与相同的评论匹配,日期和公司 ID 很接近,但只显示了一个匹配的重复项。

我想选择除一个重复项之外的所有重复项并将它们删除。 id 是主键 我已经为此工作了几个小时,并且不断收到有关操作数需要 1 列或删除非键等的错误。请帮忙,其他删除答案似乎不起作用。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您的评论组有多个 id,这就是为什么您不能将它们用于 DELETE。

    在字段列表中尝试GROUP_CONCAT(id) 以查看 ID 号列表。

    对于组内容相似是不够的 - 如果每个字段都相同,那么就这些字段而言,它只是一个有用的组,考虑到主键的存在,它不会是。

    【讨论】:

      【解决方案2】:

      试试这个...

      DELETE FROM New_opinion n WHERE n.comment,n.Date,n.company_id 
      IN( 
          SELECT temp.comment,temp.Date,temp.company_id FROM 
          (SELECT comment,Date,company_id, id,date,count(*) AS rep,comment
           FROM New_opinion 
           GROUP BY comment,Date,company_id 
           HAVING rep>1 ) temp);
      

      我希望这会奏效..

      【讨论】:

        【解决方案3】:

        假设您为 SMITH & SON 公司提供了三个重复项,保留其中的哪一行是否重要?如果是这样(比如每个公司按日期最新的一个),那么您可能希望将它们选择到新表中,然后截断旧表,然后将新表中的值复制回旧表,然后添加唯一索引跨越这些列。如果保留哪些并不重要,但只保留一个,那么您可以立即添加索引,告诉它忽略该表,这将立即删除重复项,为每个发生重复项的公司留下一个随机行。后者是这样的:

        ALTER IGNORE TABLE yourtablename ADD UNIQUE companyid, date, comment
        

        如果您需要最新的每个日期以防每家公司重复,请参阅手册中 GROUPWISE MAXIMUM 下的教程

        【讨论】:

          【解决方案4】:

          尝试这样做以保留 id 最低的行

          DELETE r1 FROM tableName r1, tableName r2 WHERE r1.id > r2.id AND r1.x = r2.x
          

          要保留具有最高 id 的行,只需更改

          WHERE r1.id < r2.id
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-18
            • 1970-01-01
            • 2010-09-19
            相关资源
            最近更新 更多