MySQL去重的方法整理

【初级】有极少的重复行

使用distinct查出来,然后手动一行一行删除。

【中级】按照单个字段的重复去重

例如:对id字段去重

使用方法:获取id的重复字段的值,利用相同id字段所在的行中,比较出数据不同的字段,删除 除了最小(或最大)的字段所在的该行之外的所有重复的行。一般使用主键来比较,因为主键的值一定是唯一值,绝对不相同。

id  name1    a1    b2    c2    a3    c
id  name1    a 2    a
delete from a_tmp where id in (select * from (select b.id from a_tmp b group by b.id having count(b.id) >1) bb) and name not in (select * from (select min(a.name) from a_tmp a GROUP BY a.id having count(a.id) >1) aa);

上述加粗并绿色的字,必须加别名,必须使用select * from (……)这样的格式,否则会报错:

[Err] 1093 - You can't specify target table 'a_tmp' for update in FROM clause

【高级】按多个字段的重复来去重

例如:对id,name相同的去重,即:对id,name都相同的算作重复行,对id相同而name不同的算作不重复行

使用方法:和单个字段相似,一般使用主键来比较,因为主键的值一定是唯一值。

id  name  rowid1  a      11  a      21  b      32  b      42  b      53  c      63  d     7
id  name  rowid1  a      1 1  b      32  b      43  c      63  d     7

第一种:

delete from a_tmp where (id,name) in (select * from (select b.id,b.name from a_tmp b group by b.id,b.name having count(b.id) >1) bb) and rowid not in (select * from (select min(a.rowid) from a_tmp a group by a.id,a.name having count(a.id) >1) aa);

将id和name字段的值连接起来插入到临时表中b_tmp,这样便可以使用【中级】的单字段的判断删除方法。

#将两字段连接的值,a_tmp表中唯一值的字段插入b_tmp表

insert into b_tmp  select concat(id,name),rowid from a_tmp;#查出需要留下来的行select id_name,max(rowid) from b_tmp  group by id_name having count(id_name)>1;#使用【中级】的方法,或存储过程完成去重的工作

例如:

使用方法:对于整行的数据都一样,是没办法使用SQL语句删除的,因为没有可以使用的条件限制来留下一行删除所有与其相同的行。没有不同的字段可以自己创造不同的字段,即:添加一个字段,设为自增长,并设为主键,它会自动添加上值。

id  name1   a1   a1   b1   b2   c2   c3   c3   c
id  name   rowid1   a       11   b       32   c       53   c       7

添加一个自增长的字段,并暂时设为主键。

使用上面【中级】和【高级】的方法操作。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多相关文章

  1. MySQL系列多表连接查询92及99语法示例详解教程
  2. Linux下MYSQL 5.7 找回root密码的问题(亲测可用)
  3. MySQL 什么时候使用INNER JOIN 或 LEFT JOIN
  4. ES6 变量声明,箭头函数,数组方法,解构赋值,JSON,类与继承,模块化练习
  5. 浅谈Java中Collections.sort对List排序的两种方法
  6. Python list sort方法的具体使用
  7. python list.sort()根据多个关键字排序的方法实现
  8. android上一些方法的区别和用法的注意事项
  9. android实现字体闪烁动画的方法

随机推荐

  1. Android FFMPEG音视频开发(四)
  2. 使用FragmentTabHost时,tabwidget被framen
  3. Android 底部菜单栏RadioButton+Fragment
  4. Android菜单的几种方法
  5. android 判断网络连接状态
  6. 2013.11.28 ——— android 网络3g wifi
  7. 【Android】application标签说明
  8. android 关于图片的放大,缩小,旋转功能的实
  9. FragmentTabhost记录
  10. Android 稀疏镜像格式 (android sparse i