zoukankan      html  css  js  c++  java
  • mysql去除重复数据

    转: https://www.cnblogs.com/qlqwjy/p/8270011.html

    今天一个同学问我mysql去除重复数据,自己做了个测试顺便记录下:

    查看表结构:

    复制代码
    mysql> desc testdelete;
    +-------+-------------+------+-----+---------+----------------+
    | Field | Type        | Null | Key | Default | Extra          |
    +-------+-------------+------+-----+---------+----------------+
    | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    | one   | varchar(40) | YES  |     | NULL    |                |
    | two   | varchar(40) | YES  |     | NULL    |                |
    | three | varchar(40) | YES  |     | NULL    |                |
    +-------+-------------+------+-----+---------+----------------+
    4 rows in set (0.10 sec)
    复制代码

    表的数据:

    复制代码
    mysql> select * from testdelete;
    +----+------+------+-------+
    | id | one  | two  | three |
    +----+------+------+-------+
    |  1 | A    | A    | A     |
    |  2 | B    | B    | B     |
    |  3 | C    | C    | C     |
    |  4 | D    | D    | D     |
    |  5 | E    | E    | E     |
    |  6 | A    | A    | B     |
    | 12 | A    | A    | A     |
    | 13 | A    | A    | A     |
    | 14 | A    | A    | A     |
    | 15 | A    | A    | A     |
    +----+------+------+-------+
    10 rows in set (0.00 sec)
    复制代码

    接下来进行测试:

    1.根据one列查询重复的数据(根据单列判断重复)

    SELECT * FROM testdelete 
    WHERE ONE IN (SELECT ONE FROM testdelete GROUP BY ONE HAVING COUNT(ONE) > 1) 

    结果:

     2.删除表中的重复记录:(根据单列删除且保留ID最小的一条

    复制代码
    DELETE
    FROM testdelete
    WHERE ONE IN(SELECT
                   ONE
                 FROM testdelete
                 GROUP BY ONE
                 HAVING COUNT(ONE) > 1)
        AND id NOT IN(SELECT
                        MIN(id)
                      FROM testdelete
                      GROUP BY ONE
                      HAVING COUNT(ONE) > 1)
    复制代码

     报错:

    原因:大概是因为不能直接在查询的语句中进行操作。

    解决办法:将查询包装一层:

    复制代码
    DELETE
    FROM testdelete
    WHERE ONE IN(SELECT
                   ONE
                 FROM (SELECT
                         ONE
                       FROM testdelete
                       GROUP BY ONE
                       HAVING COUNT(ONE) > 1) a)
        AND id NOT IN(SELECT
                        *
                      FROM (SELECT
                              MIN(id)
                            FROM testdelete
                            GROUP BY ONE
                            HAVING COUNT(ONE) > 1) b)
    复制代码

     结果:

    (5 row(s) affected)
    Execution Time : 00:00:00:094
    Transfer Time : 00:00:00:000
    Total Time : 00:00:00:094

    再次查看数据:

    将数据还原。 

     3.根据one,two,three判断重复:(根据单多判断重复)

    SELECT * FROM testdelete a 
    WHERE (a.one,a.two,a.three) IN (SELECT ONE,two,three FROM testdelete GROUP BY ONE,two,three HAVING COUNT(*) > 1) 

    结果;

    4.删除表中的重复数据(根据多列进行删除且保留ID最小的一条)

    复制代码
    DELETE
    FROM testdelete
    WHERE (ONE,two,three)IN(SELECT
                              ONE,
                              two,
                              three
                            FROM (SELECT
                                    ONE,
                                    two,
                                    three
                                  FROM testdelete
                                  GROUP BY ONE,two,three
                                  HAVING COUNT( * ) > 1) a)
        AND id NOT IN(SELECT
                        MIN(id)
                      FROM (SELECT
                              MIN(id) AS id
                            FROM testdelete
                            GROUP BY ONE,two,three
                            HAVING COUNT( * ) > 1) b)
    复制代码

     结果:

    (4 row(s) affected)
    Execution Time : 00:00:00:125
    Transfer Time : 00:00:00:000
    Total Time : 00:00:00:125

    查看数据:

    数据还原

     5. 查找表中多余的重复记录(多个字段),不包含id最小的记录 (根据多个字段查重复不包含id最小的)

    复制代码
    SELECT *
    FROM testdelete a
    WHERE (a.one,a.two,a.three)IN(SELECT
                                    ONE,
                                    two,
                                    three
                                  FROM testdelete
                                  GROUP BY ONE,two,three
                                  HAVING COUNT( * ) > 1)
        AND id NOT IN(SELECT
                        MIN(id) AS id
                      FROM testdelete
                      GROUP BY ONE,two,three
                      HAVING COUNT( * ) > 1)
    复制代码

     结果:

  • 相关阅读:
    数据库sql一些常考基础命令
    C# and .NET之父——传奇的anders hejlsberg
    数据库中3大范式的详解
    小胖求职记—求职中的技巧
    程序员们喜爱看的文章
    为什么世界上没有天才(转)
    C语言中system函数的使用
    关于DataGrid的知识和技巧
    分页
    在调用方法时产生异常的处理方法
  • 原文地址:https://www.cnblogs.com/kenD/p/11151407.html
Copyright © 2011-2022 走看看