mysql查2个字段数据相等_mysql如何去除两个字段数据相
同的记录
mysql如何去除两个字段数据相同的记录
关注:209  答案:5  mip版
解决时间 2021-01-16 00:22
已解决
2021-01-15 13:51
mysql如何去除两个字段数据相同的记录
最佳答案
2021-01-15 14:17
其实你会⽤英⽂搜索的话。可以很⽅便在stack overflow上 到相关的信息 真的学CS的就不要⽤百度了 ⽤google你会发现⼀个不⼀样的世界的
随便贴⼀个
sql - How can I remove duplicate rows?
稍微讲⼀下其中⼀个思路(⾥⾯有很多很好的答案 你可以⾃⼰去看)
就是做⼀个group by 保留其中id 最⼤的(你说⾃增长 id最⼤的应该就是最新的)就可以了
具体sql query 可以这样写
delete from test where id not in(
select name,email,max(id) from test
group by name,email having id is not null)
全部回答
mysql删除重复的数据保留一条
1楼
2021-01-15 17:34
MySQL查询重复字段,及删除重复记录的⽅法
数据库中有个⼤表,需要查其中的名字有重复的记录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)
2楼
2021-01-15 17:03
想要去除两个字段数据相同的记录只需要把把这张表当成两张表来处理:
下⾯的的语句,p1.id < p2.id,所以获取到的是id最⼤的,因为p1.id⼩于p2.id就会被删除,只有最⼤的值不满⾜。如果要获取id最⼩的那个,只需要把''即可。
DELETe p1 from TABLE p1, TABLE p2 WHERe p1.name = p2.name ail = p2.email AND p1.id
3楼
2021-01-15 15:50
⽐如⼀个表table,表的主键为id,判断是否有相同数据的列名分别为a、b
delete table where id in
(select a.id from table a left join table b where a.a=a.b)
4楼
2021-01-15 14:23
⽅法有很多,这⾥介绍两种
⽅法⼀、
如果要保留id的最⼩值,例如:
数据:
执⾏sql:select count(*) as count ,name,id from ceshi group by name
<img
最后要删除的sql为:delete from ceshi where id not in (select count(*) as count ,name,id from ceshi group by name)
如果想保留id的最⼤值:
简单的办法是:delete from ceshi where id not in (select count(*) as count ,name,id from (select * from ceshi order by id desc) group by name)
如果想要删除的是两个列⾥⾯对应相同的数据,也就是说表⾥⾯有两条记录的name都是admin,要是只想保留其中⼀条的话,order by 的时候增加⼀个值即可,例如:
delete from ceshi where id not in (select count(*) as count ,name,id from ceshi group by name,email)
⽅法⼆、
只需要把你这张表当成两张表来处理就⾏了。
DELETe p1 from TABLE p1, TABLE p2 WHERe p1.name = p2.name ail = p2.email AND p1.id < p2.id;
这⾥有个问题,保留最新的那⼀条(也就是ID最⼩的那个)
上⾯的的语句,p1.id < p2.id,所以获取到的是id最⼤的,因为p1.id⼩于p2.id就会被删除,只有最⼤的值不满⾜。如果要获取id最⼩的那个,只需要把''即可。
当然是⽤group by,count可以更精准控制重复n次的情况。
我要举报
如果感觉以上信息为低俗/不良/侵权的信息,可以点下⾯链接进⾏举报,我们会做出相应处理,感谢你的⽀持!
点此我要举报以上信息!
推荐资讯
⼤家都在看
联系企业商铺⽹
Copyright(©) 2021 企业商铺⽹™版权所有

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。