mysql 删除重复数据_MySQL删除重复数据

问:假如有一个student(table_id,name,age)的表,有重复name和age数据, 怎么写出delete重复数据的sql?

假如:我们只保留重复数据中, table_id最小的记录

cebef49aa64969ac9447c9b2a0273d79.png

一步一步分析:

首先我们要知道哪些数据是重复的, group by 聚集函数可以帮我找到:

SELECT    name , count(*)FROM    studentGROUP BY    `name`HAVING    count(*) > 0

ac8bf5f594a1becf323c9b05fe772aef.png

然后我们想要删除重复数据,只保留id最小的, 这里我先要知道所有准备删除的数据,即重复数据。

根据上面已知的name,我们可以用sql获得重复数据

SELECT    *FROM    studentWHERE NAME IN(        SELECT            *        FROM            (                SELECT                    NAME                FROM                    student                GROUP BY `name`                HAVING                    count(*) > 1            ) t1    )

7f412fd1b8b9285dfca915d87525fd2f.png

最后我们要删除这些重复数据,只保留最小的table_id,还是需要用到group by,获得最小的table_id

完整的sql:

注意:把下面 {SELECT *} 改成 { DELETE } 就可以删除重复数据了

SELECT    *FROM    studentWHERE NAME IN(        SELECT            *        FROM            (                SELECT                    NAME                FROM                    student                GROUP BY `name`                HAVING                    count(*) > 1            ) t1    )AND table_id NOT IN(    SELECT        *    FROM        (            SELECT                MIN(table_id)            FROM student            GROUP BY NAME            HAVING                count(*) > 1        ) t2)

查询出待删除的数据:

19fca69e8c048526d0ba1b916577347d.png

上面的sql是不是要把屏幕拉长了看,而且效率不高?

下面是另外一种写法,高效很多

SELECT  * FROM  studentINNER JOIN (   SELECT   min(table_id) AS minId, age   FROM    student   GROUP BY    name HAVING count(*) > 1) t2 ON t2.age = student.age WHERE student.table_id > t2.minId;

354a43a2d16aca9983be956bcb7381b3.png


版权声明:本文为weixin_39708737原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。