【问题标题】:remove duplicate data from sql从sql中删除重复数据
【发布时间】:2018-04-20 09:25:39
【问题描述】:

我有一个名为“data”的 sql 数据库和一个表“disk”,其中有 5 列

CREATE TABLE `disk` (
  `id` int(11) NOT NULL,
  `title` text COLLATE utf8_unicode_ci NOT NULL,
  `link` text COLLATE utf8_unicode_ci NOT NULL,
  `mag` text COLLATE utf8_unicode_ci NOT NULL,
  `size` varchar(10) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

“mag”列有一些重复项。

我想删除 mag 列相同的完整行。

注意:假设 mag 列有 1,2,3,4,4,5.... 我想从中删除一个重复的 4。表示我不想完全删除这两个 4。必须保留一个“4”。

它的查询应该是什么样子?

【问题讨论】:

  • 保留哪个 id = 4 行?
  • 考虑在您的问题中包含用于 DDL 的 sql 和示例数据,这样可以帮助其他成员更快、更准确地为您提供答案
  • 两者都一样没关系@jarlh

标签: mysql sql duplicates


【解决方案1】:

尝试以下操作以删除具有相同 d 列的重复项并保留 id 值最低的一行::

DELETE d1 
FROM  disk d1, disk d2 
WHERE d1.id > d2.id AND 
      d1.d = d2.d;

【讨论】:

    【解决方案2】:

    试试这个:

    DELETE disk
    FROM disk
    INNER JOIN (
           SELECT id,
                   d,
                   CASE WHEN d = @prevd 
                           THEN @id:=@id+1
                        ELSE @id:=1
                   END AS rankNum,
                   @prevd:=d AS prd
           FROM disk, (SELECT @prevd:=NULL,@id:=NULL) t
          ) t1
    ON disk.id = t1.id
    WHERE rankNum >= 2;
    

    演示请点击以下链接:

    https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=318e94a135853fcd15b14e4b8bbf1fdc

    【讨论】:

    • d 是一个文本字段,第二件事是它编译时没有错误,但它没有删除任何行... 0 行受影响
    • 创建表disk (id int(11) NOT NULL, title text COLLATE utf8_unicode_ci NOT NULL, link text COLLATE utf8_unicode_ci NOT_NULL, mag text NULL COLLATEf ut , size varchar(10) COLLATE utf8_unicode_ci NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;这是我的实际表
    • 我编辑了我的答案再试一次,告诉我它是如何不起作用的。 @user9673975
    【解决方案3】:

    您可以执行以下操作..
    创建新表并保持随机行:

    1. 首先将表disk(唯一数据)复制到临时表disk2

    2. 删除表disk

    3. 将临时表 disk2 重命名为 disk

      create table disk2 select * from disk group by d;
      
      drop table disk;
      
      rename table disk2 to disk;
      

    注意:这里我们使用 group by*,因为 OP 不关心要保留哪一行。


    创建新表并使用最小或最大 id 保持行: 另一种方法来做到这一点,同时保持与minmax id 的行

    /*copy data from disk to temp table disk2*/
    create table disk2 select * from disk
        where id in (select min(id) from disk group by d);
    /*drop table disk*/
    drop table disk;
    /*rename temp table to disk*/
    rename table disk2 to disk;
    


    更新:另一种方法
    从现有表中删除重复项

        /*first create a dups table for duplicates*/
        create table dups select * from disk
            where id not in (select min(id) from disk group by d);
        /*now delete all rows which are present in dups table*/
        delete from disk where id in (select id from dups);
        /*now delete the dups table*/
        drop table dups;
    

    【讨论】:

    • 它运行良好,但仍有问题...我的服务器不允许我在一小时内对数据库进行超过 5000 次更改。所以创建一个大约 10000 行的新表,然后重命名该表,是行不通的......
    【解决方案4】:
    delete from disk
    where id  in 
    (
    select id 
    from task
    group by id 
    having count(id) >1
    )
    

    【讨论】:

    • 根本不会删除任何行。
    • 感谢您提供此代码 sn-p,它可能会提供一些有限的短期帮助。一个正确的解释would greatly improve 它的长期价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
    【解决方案5】:

    无需创建任何临时表

    我希望这对你有用

    DELETE ColumnName
    FROM TableName
    INNER JOIN 
    (
        SELECT  MAX(ID) AS ID
        FROM TableName
        GROUP BY ID
        HAVING COUNT(*) > 1
    ) Duplicate on Duplicate.ID = TableName.ID
    WHERE TableName.ID < Duplicate.lastId;
    

    请查看以下链接以获取更多建议

    MySQL delete duplicate records but keep latest

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      相关资源
      最近更新 更多