mysql中去重 用group by优化distinct 用法在使用 MySQL 时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录 , 但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段,例如有如下表user:
用distinct来返回不重复的用户名:select distinct name from user;,结果为:
这样只把不重复的用户名查询出来了,但是用户的id,并没有被查询出来:select distinct name,id from user;,这样的结果为:
distinct name,id 这样的mysql 会认为要过滤掉name和id两个字段都重复的记录,如果sql这样写:select id,distinct name from user,这样mysql会报错,因为distinct必须放在要查询字段的开头 。
所以一般distinct用来查询不重复记录的条数 。
如果要查询不重复的记录,有时候可以用group by :
select id,name from user group by name;
怎么删除重复的Mysql数据?MYSQL里有五百万数据,但大多是重复的 , 真实的就180万,于是想怎样把这些重复的数据搞出来,在网上找了一圈,好多是用NOT IN这样的代码,这样效率很低,自己琢磨组合了一下,找到一个高效的处理方式,用这个方式,五百万数据,十来分钟就全部去除重复了,请各位参考 。
第一步:从500万数据表data_content_152里提取出不重复的字段SFZHM对应的ID字段到TMP3表
1create table tmp3 as select min(id) as col1 from data_content_152 group by SFZHM;
【mysql去重怎么解决 mysql去重操作】第二步:创建新表RES
1234CREATE TABLE `res` (`id` int(11),`sfz` char(20)) ENGINE=MyISAM;
第三步:把TMP3表ID对应到data_content_152里需要提取的数据添加到RES表的SFZ字段
1INSERT INTO res (sfz) SELECT sfzhm FROM data_content_152,tmp3 where data_content_152.id=tmp3.col1
至此,就在MYSQL里实现了 , 给数据表data_content_152完全删除重复数据,把去重复后的数据导入到RES表 。
MySQL_select distinct无法实现只对单列去重,并显示多列结果的解决方法可以看到表中的value字段有重复 , 如果想筛选去重,使用select distinct语句如下:
得到结果会是
| value
| a
| b
| c
| e
| f
筛选去重是实现了,可是只有选中的value列显示了出来,如果我想知道对应的id呢?
尝试一下把id字段加入sql语句 , 如下:
得到结果:
| value| id
| a| 1
| b| 2
| c| 3
| c| 4
| e| 5
| f| 5
更换一下sql语句中id和value的顺序,如下:
得到结果:
| id|value
| 1| a
| 2| b
| 3| c
| 4| c
| 5| e
| 5| f
好像看明白它的作用结果了,只有id和value两个字段同时重复时,select distinct语句才会把它列入“去重”清单
所以能看到id为3和4的value虽然都是4,但由于select语句中写了id字段,它也默认会对id字段起效 。
而且如果sql语句中把DISTINCT放到只想起效的字段前,那也是不行的....比如sql语句改为:
会提示sql报错 。
那到底怎么样能得到我想要的只对value字段内容去重,显示结果又能保留其他字段内容呢....
找到的解决方法是使用group by函数,sql语句如下:
得到结果:
| min(id)|value
| 1| a
| 2| b
| 3| c
| 5| e
| 5| f
完成目标了?!
如果把sql语句中的min()换成max()呢?
得到结果:
| min(id)|value
| 1| a
| 2| b
| 4| c
| 5| e
| 5| f
也完成目标了?!
同时比对两次sql运行结果可以发现,
第一次使用min(id)时 , 由于重复结果存在两条而id最小的为为3,符合min(id)的筛选条件 , 所以结果中把id等于4的重复记录删除了 。
第二次使用max(id)时结果中,也就把id等于3的重复记录删除了
可以推论到假如还存在一条id=5,value=https://www.04ip.com/post/c的记录 , 使用max(id)时得到的结果里就会是5 c这条了 。
再来尝试一下,如果min()和max()用在value字段里呢:
得到结果:
| id|min(value)
| 1| a
| 2| b
| 3| c
| 4| c
| 5| e
得到结果:
| id|min(value)
| 1| a
| 2| b
| 3| c
| 4| c
| 5| f
再仔细想想 , 这种需求也只出现在不是那么care显示结果中,非去重目标字段的内容时才能使用,如果需要指定这些字段的值 , 可能筛选条件就不是min()和max()那么简单了....
以上 。
mysql去重怎么解决的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于mysql去重操作、mysql去重怎么解决的信息别忘了在本站进行查找喔 。
推荐阅读
- 黄浦区代理记账软件,黄浦区代理记账公司
- go语言写qq,go语言写前端
- postgresql大数据优化,sql大数据查询优化
- 女朋友手机在线是什么意思,手机在线啥意思?
- linux中gzip命令 linux gzip命令
- redis连接php,redis连接数配置多少合适
- 卧室电视怎么看机顶盒节目,卧室电视机怎么收看客厅的宽带电视
- gis检核,gis核密度
- mysql平均数数怎么求 mysql 求平均数