MySQL去重的方法整理

所属分类: 数据库 / Mysql 阅读数: 662
收藏 0 赞 0 分享

MySQL去重的方法整理

【初级】有极少的重复行

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

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

例如:对id字段去重

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

id  name

1    a

1    b

2    c

2    a

3    c

结果:

id  name

1    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  rowid

1  a      1

1  a      2

1  b      3

2  b      4

2  b      5

3  c      6

3  d     7

结果:

id  name  rowid

1  a      1 

1  b      3

2  b      4

3  c      6

3  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  name

1   a

1   a

1   b

1   b

2   c

2   c

3   c

3   c

结果:

id  name   rowid

1   a       1

1   b       3

2   c       5

3   c       7

操作:

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

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

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

更多精彩内容其他人还在看

mysql数据表的基本操作之表结构操作,字段操作实例分析

这篇文章主要介绍了mysql数据表的基本操作之表结构操作,字段操作,结合实例形式分析了mysql表结构操作,字段操作常见增删改查实现技巧与操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

mysql学习笔记之完整的select语句用法实例详解

这篇文章主要介绍了mysql学习笔记之完整的select语句用法,结合实例形式详细分析了mysql select语句各种常见参数、使用方法及操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

MySQL5.6 GTID模式下同步复制报错不能跳过的解决方法

搭建虚拟机centos6.0, mysql5.6.10主从复制,死活不同步,搞了一整天找到这篇文章终于OK了,特分享一下,需要的朋友可以参考下
收藏 0 赞 0 分享

MySQL开启慢查询方法及实例

这篇文章主要介绍了MySQL开启慢查询方法及实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

简单了解MYSQL数据库优化阶段

这篇文章主要介绍了简单了解MYSQL数据库优化阶段,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Windows下MySQL主从复制的配置方法

MySQL主从复制允许将来自一个数据库(主数据库)的数据复制到一个或多个数据库(从数据库),主数据库一般是实时的业务数据写入和更新操作,从数据库常用的读取为主
收藏 0 赞 0 分享

Mysql数据库设计三范式实例解析

这篇文章主要介绍了Mysql数据库设计三范式实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

mysql数据类型和字段属性原理与用法详解

这篇文章主要介绍了mysql数据类型和字段属性,结合实例形式分析了mysql数据类型和字段属性基本概念、原理、分类、用法及操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

mysql连接查询、联合查询、子查询原理与用法实例详解

这篇文章主要介绍了mysql连接查询、联合查询、子查询原理与用法,结合实例形式详细分析了mysql连接查询、联合查询、子查询的基本概念、功能、原理、用法及操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

Window下如何恢复被删除的Mysql8.0.17 Root账户及密码

这篇文章主要介绍了Window下如何恢复被删除的Mysql8.0.17 Root账户及密码,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多