mysql如何去除两个字段数据相同的记录
MySQL查询重复字段,及删除重复记录的方法
十余年的姑苏网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站的优势是能够根据用户设备显示端的尺寸不同,自动调整姑苏建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联公司从事“姑苏网站设计”,“姑苏网站推广”以来,每个客户项目都认真落实执行。
数据库中有个大表,需要查找其中的名字有重复的记录id,以便比较。如果仅仅是查找数据库中name不重复的字段,很容易:
SELECT min(`id`),`name` FROM `table` GROUP BY `name`;
但是这样并不能得到说有重复字段的id值。(只得到了最小的一个id值)查询哪些字段是重复的也容易:
SELECT `name`,count(`name`) as count FROM `table` GROUP BY `name` HAVING count(`name`) 1 ORDER BY count DESC;
但是要一次查询到重复字段的id值,就必须使用子查询了,于是使用下面的语句。
SELECT `id`,`name` FROM `table` WHERE `name` in (
SELECT `name`
FROM `table`
GROUP BY `name` HAVING count(`name`) 1);
但是这条语句在mysql中效率太差,感觉mysql并没有为子查询生成零时表。于是使用先建立零时表:
create table `tmptable` as (
SELECT `name`
FROM `table`
GROUP BY `name` HAVING count(`name`) 1);
然后使用多表连接查询:
SELECT a.`id`, a.`name` FROM `table` a, `tmptable` t WHERE a.`name` = t.`name`;
结果这次结果很快就出来了。
========================
查询及删除重复记录的方法
(一)
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
select * from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) 1)
2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
delete from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) 1)
and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )1)
3、查找表中多余的重复记录(多个字段)
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) 1)
4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
delete from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)1)
5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)1)
mysql 如何删除重复的数据
首先是将数据库里边的重复记录删掉,我看网上有好多答案是这样的:
1 delete from people
2 where peopleId in (select peopleId from people group by peopleId having count(peopleId) 1)
3 and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )1)
但其实我每次运行这条语句都是行不通的,会报错:
SQL 错误 [1093] [HY000]: You can't specify target table 'test1' for update in FROM clause
java.sql.SQLException: You can't specify target table 'test1' for update in FROM clause
去网上查过好像是说update以及delete操作没办法跟查询操作一起做的,我看过有的更新的跟查询的一起做的好像是给查出来的那部分起个别名,然后进行更新就可以了,但是删除这个我起了别名也不对,不知道是我写错还是不行,我就跳过这个方法了。
我用的方法是:先查出数据库中的重复记录的数据中的一条,这个不难,很简单的,sql语句如下:
select * from test1 where name in (select name from test1 group by name having count(name) 1)
and id in (select min(id) from test1 group by name having count(name)1)
结果如下:
id |name |phont |
---|--------|-------|
1 |name22 |123 |
3 |name222 |123 |
5 |name2 |123123 |
8 |123 |123123 |
11 |name1 |123123 |
13 |111 |1231 |
14 |112 |1232 |
这些都是不重复的,换句话说都是要保留的,不被删掉的,而其余与这些结果中name相同的应该被删掉。
也就是说将上边那个sql语句id后边加一个not ,查出来的结果就是要删掉的:结果如下
id |name |phont |
---|--------|-------|
2 |name22 |123 |
4 |name222 |123 |
6 |name2 |123123 |
7 |name2 |NULL |
9 |123 |123123 |
10 |123 |123123 |
12 |name1 |123123 |
15 |111 |1233 |
16 |112 |1234 |
17 |111 |1235 |
18 |112 |1236 |
我把这些需要删掉的存到另外一个表里,然后我新建一个test2表,结构复制test1的结构就好了
1 CREATE TABLE `test2` (2 `id` int(11) NOT NULL AUTO_INCREMENT,3 `name` varchar(50) DEFAULT NULL,4 `phont` varchar(50) DEFAULT NULL,5 PRIMARY KEY (`id`)6 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
然后插入语句是:
1 insert into test2(2 select * from test.test1 where name in (select name from test.test1 group by name having count(name) 1)
3 and id not in (select min(id) from test.test1 group by name having count(name)1)
4 )
然后test2的表里的数据就是下图这样的:
那接下来做的就是删掉test1表里边与test2表的id相同的数据。
1 delete a.* from test1 a, test2 b where a.id = b.id ;
这样,test1里边的数据就变成了:
这样的结果就是完全不重复的,但是我还想要他们的id是连续的,而不是这样的断开的。
我的做法是将这个表的除掉id之外的所有字段查出插入到另外一个表test3中,当然,test3要设置id为自增主键,但是不插入id,让它自增,就连续了
当然要新建表test3啦,不过把上边新建的test2那个复制下来改名字为test3就好啦。
然后插入:
1 insert into test3(name, phont)2 (select name, phont from test2)
test3表里的结果就是:
这样就可以把test3改成你想要的名字,然后删掉test1和test2了,大功告成~
不过感觉还可以就是将已经删掉重复数据的表test1的数据全都导出来,一般的数据库连接工具都有这样的功能,导成sql格式的,然后新建一个表,比test1多增一个自增主键字段叫NewId字段,但是Id字段不能再自增了,然后将导成的sql文件导入,不过那个sql文件可能要编辑一下,改一下自增主键id变为普通的字段什么的,然后到新表了之后,删掉id字段,修改NewId为Id,应该也可以,但是这个方法我没试过,原先预想过要这么做但是没有这么做,估计以后可以试试,但是感觉两种的麻烦程度都差不多啊,但是如果将sql语句写下来之后可能还是第一种方法比较快一点吧。
mysql 有重复数据,怎么删掉
这个需要分情况。1,你的数据库表中有主键,且主键上面的数据为唯一值。也就是没有重复值。那么你在删除的时候,将这个唯一值作为条件进行删除。如: delete from [表名] where id=12.所有的数据相同,那么你只能打开数据表,手工选定其中某一条,进行删除。
当前题目:关于mysql怎么删除相同的的信息
本文地址:http://scyingshan.cn/article/dssdpcj.html