mysql 查找重复记录 删除重复记录

2009年11月17日 | 分类: MySQL | 标签: ,

几天没更新了,比较懒。
在公司,我重新设计了SP系统,并完全废掉了原系统,我来做新的,现在基本可以投入使用,为了兼容原来的数据,要把旧数据迁移过来,
中途就会有一些重复记录,需要消灭。
所谓重复,那肯定是记录里的某些字段有一样的,根据这个来判断了。
一,查找重复
表person
id int 10
name varchar 20
这样的一个表,根据name来判断重复,我们可以把记录都查找出来
select *,count(*) as total from person group by name order by total desc
group by name 按name进行分组,name一样的记录只显示一条,count(*) as total ,用这个可以看到name一样的记录有多少条,为了直观,order by total desc 把重复记录的排在前面,这样就可以找出这个表里面的重复记录了。
PS:这里是把所有的数据显示出来了,那些total=1的是没有重复的,如果只想要重复的在group by name 后面加having 子句 如下
select *,count(*) as total from person group by name having total>1 order by total desc
这样就只有重复的记录了 当然你的表 肯定 不会这么简单,在group by 前面可以添加where子句

二,删除重复
1.这个是从网上随便找的(改了下,适用上面的那个表),像我这样的门外汉,还看不明白,来分析下
delete from person where name in (select name from person group by name having count(*) > 1)
and id not in (select min(id) from person group by name having count(*)>1)
name in (select name from person group by name having count(*) > 1) 这一句找出name有重复的所有记录
id not in (select min(id) from person group by name having count(*)>1)这一句找出id不等于这些重复记录的最小id
用and连接起来就是,删除重复记录,且保留id最小的那一条,要不然全删除了
2.还看了个,不用连接来做的,思路是用连接选出除了最小id可是最大id的所有记录,然后删除,具体代码不想找了。
以上的方法虽然说可以实现,但是代码量太大了。。。。。。
3.我用的是下面这种,简单直观
delete a from person a left join person b on a.name=b.name where a.id>b.id
对person做自身连接,找出name一样的记录,附加条件是a.id>b.id这样就把重复记录里面id最小的值保留下来了

后记:留给新手,老手一边玩去!
非常感谢网友 chopper 的发问,在上面第三种方法删除重复语句的时候,少写了一个字母,否则有语法错误

  1. 2009年11月19日09:33

    哈哈,你最后的方法比较喜欢。简单方便,清晰明了。

    像第一个就还要绕半天,我看了也是想半天为啥还保留一个。呵。。

    不保留的话就全删了,ID重复也要留一个才是,去重并不等于全删,呵呵。学习了。

    • 2009年11月19日09:38

      恩,在网上看到很多人写出的删除重复都很复杂,而且那些复杂的句子,偏偏被人转来转去,对新手来有障碍(不过,我也是新手)。

  2. 2010年6月24日18:21

    博主你好,我是刚学Mysql的新手,实验过程中出现了重复项。可是我在参考您的方法时执行出错。

    后来我就按照您的例子建了个person表,还是不能实现操作。特留言向您请教。

    PS:实验环境 rhel5.4 mysql 5.1.47 和 mysql 5.0.77

    mysql> select * from person;
    +——+——+
    | id | name |
    +——+——+
    | 1 | tom |
    | 2 | lucy |
    | 3 | johy |
    | 4 | Joy |
    | 2 | lucy |
    +——+——+

    mysql> delete from person as a left join person b on a.name=b.name where a.id>b.id;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘as a left join person b on a.name=b.name where a.id>b.id’ at line 1

    • 2010年6月29日10:24

      写了一直没有注意,delete from person a left join person b on a.name=b.name where a.id>b.id,这一句在from前面要选择要进行删除的表名,我没有写上,你再试试
      delete a from person a left join person b on a.name=b.name where a.id>b.id