mysql数据库去除重复数据
(2012-11-13 18:48:46)
今天对数据库进行了判断重复,以前对数据库的语句只会简单操作,下面拿一个简单的例子对数据进行去重。
首先创建数据表:
create table test(id int(11) auto_increment,name varchar(12) primary key(id));
插入数据:
insert into test(name) values('hello');多插入几条后,下面就开始我们的数据表去重操作了。
刚开始的时候我写的语句:
首先创建数据表:
create table
插入数据:
insert into test(name) values('hello');多插入几条后,下面就开始我们的数据表去重操作了。
刚开始的时候我写的语句:
select min( id ) from `test` group by (
name
);这样的操作是得出数据表里面非重复的所有数据,并且我选择的是min函数,这样就会选择出重复里面id最小的行,若想要留下重复行里id最大的数据需要用max(id),然后将其作为子操作,写出的sql语句为:
delete from `test` where id not in (select min(id) from `test` group by (name));
然后进行执行,原以为能实现想要的结果,可是很悲剧的结果:
#1093 - You can't specify target table 'site_info' for update in FROM clause
从来没有见过这样的语句,因为没有过多的操作过数据库和写过复杂的sql语句,后来请教了一下身边的牛人,最后知道:数据库现在不支持这样的操作(对一个表进行select等子操作后,然后对该表做delete或者updata这类的操作。)。
难道只能创建临时表了吗?
临时表的做法:创建一个临时表,然后将
select min( id ) from `test` group by (
name);的结果放进临时表里,然后再将临时表重命名为现在的表,这样我不认为是一个便捷的方法,但是确是一个万能的方法。
后来听朋友说有其他的解决方法,那自己就寻找方法,朋友给了很多的资料和链接供我学习和查找,后来找到了一个方法(链接会在文章末尾贡献出来)。
对数据表中重复数据去重:
delete a from test a, (select c.name,max(c.id) as bid from test c GROUP BY name having count(1)>1) b where a.name=b.name and a.id < b.bid; 删除重复,留下id最大的数据
delete a from test a, (select c.name,min(c.id) as bid from test c GROUP BY name having count(1) >1) b where a.name=b.name and a.id > b.bid; 删除重复,留下id最小的数据
要是让我单独去想这样的方法实现自己的目的,估计是想不出的,自己对这方面的操作太少了,以后会多多练习。
这个方法的思想我自己给了一点认识:间接的用了临时表,对一个表用了几个别名,这样对单个数据表操作的时候,就不会出现上面说的那种情况,就好像在内存中我们有了很多的副本,对一个副本进行缩小数据量,然后在另一个副本中删除缩小后的副本,这样剩下的就是我们小的副本,对于这样的语句, 我还没有完全的分析和理解,还待进一步的分析和理解。当然需要对数据表的一些字段建立索引,这样语句的操作会更高效一点。
后来有朋友给了另个方法,原理都是一样,用临时表或者类似于我说的“副本”,对同一个表进行操作:
delete from test where id not in (select * from ((select min(id) from test group by(name)) as tmptable));
删除重复,留下id最小的数据
delete from test where id not in (select * from ((select max(id) from test group by(name)) as tmptable));
删除重复,留下id最大的数据
网上的例子也有很多,看了很多,方法也不是唯一的,据说用索引的方法也可解决这样的问题,连接如下:
http://www.2cto.com/database/201205/131949.html对于这个连接里的内容,我没去尝试,希望大家去尝试一下。
网上看了很多的例子:
本文的启示:http://hi.baidu.com/hexie007/item/4a35a01628ac3a49e75e06ce
还有其他的连接:
http://kalllx.iteye.com/blog/1453487 //临时表
http://www.d5s.cn/archives/5
http://www.360doc.com/content/10/0408/13/536925_22087659.shtml
下面的连接是对
#1093 - You can't specify target table 'site_info' for update in FROM clause
问题的解释:
http://www.cnblogs.com/chy1000/archive/2010/03/02/1676282.html
http://verysimple.com/2011/03/30/mysql-cant-specify-target-table-for-update-in-from-clause/