mysql查找2个字段数据相等_mysql如何去除两个字段数据相同的记录

本文介绍了在MySQL中如何删除具有相同字段数据的记录。提供了多种方法,包括使用GROUP BY和HAVING子句,结合DELETE语句删除不唯一的记录,或者通过子查询和临时表来实现。建议在寻找解决方案时使用英文搜索引擎,如Stack Overflow。
摘要由CSDN通过智能技术生成

mysql如何去除两个字段数据相同的记录

关注:209  答案:5  mip版

解决时间 2021-01-16 00:22

e6cb1a03ad541b3098697807b7bf1798.png

已解决

2021-01-15 13:51

mysql如何去除两个字段数据相同的记录

最佳答案

e6cb1a03ad541b3098697807b7bf1798.png

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)

全部回答

e6cb1a03ad541b3098697807b7bf1798.png

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)

e6cb1a03ad541b3098697807b7bf1798.png

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 AND p1.email = p2.email AND p1.id

e6cb1a03ad541b3098697807b7bf1798.png

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)

e6cb1a03ad541b3098697807b7bf1798.png

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 AND p1.email = p2.email AND p1.id < p2.id;

这里有个问题,保留最新的那一条(也就是ID最小的那个)

上面的的语句,p1.id < p2.id,所以获取到的是id最大的,因为p1.id小于p2.id就会被删除,只有最大的值不满足。如果要获取id最小的那个,只需要把''即可。

当然是用group by,count可以更精准控制重复n次的情况。

我要举报

如果感觉以上信息为低俗/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

点此我要举报以上信息!

推荐资讯

大家都在看



联系企业商铺网

Copyright(©) 2021 企业商铺网™版权所有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值