mysql数据库表中删除某一列值重复的全部行和只留一条



(1)mysql 数据库中删除某一列值重复的全部行(一个笔试题)
如果要求是多个字段重复的就在group后把所有要求重复的字段写上去
表名:zp
数据如下(都是int型的 sal:工资)

要求删除sal列中重复的数据的全部行,即结果如下图:



说下我的思路吧:
主要分为3步:(1)select sal,count(sal) salcount from zp group by sal //按sal分组
运行结果:
+------+----------+
| sal  | salcount |
+------+----------+
| 22.2 |        3 |
| 88.8 |        1 |
| 99.9 |        1 |
+------+----------+
(2)select t.sal from ((select sal,count(sal) salcount from zp group by sal) as t) where  t.salcount>1//找出分组后salcount大于1的sal值 
运行结果:
+----+
| sal   |
+----+
|  22.2 |
+-----+
(3)delete from zp where sal in(select t.sal from ((select sal,count(sal) salcount from zp group by sal) as t) where  t.salcount>1);//从zp表中删除sal满足第二步结果的所有行
ok:查询一下结果出现了哈哈
mysql> select * from zp ;
+----+------+
| id | sal  |
+----+------+
|  4 | 88.8 |
|  5 | 99.9 |
+----+------+

(2)只留一行
表名:fatie 
要求:删除name字段中值相同的重复行,且只留一行重复数据
 删除前(原表)如下:
删除后:

删除语句:delete from fatie where id not in(select t.id1 from ( (select max(a.id) id1 from fatie a group by a.name)as t));留下的是各组id号最大的,如果留的是最小的话换成min(a.id)就行了
如果没有加上一个中间表t,即这句话 select t.id from去掉直接写成delete from fatie where id not in(select max(id) a.id1 from fatie a group by a.name);mysql会提示错误:You can't specify target table 'fatie' for update in FROM clause (不能先select出同一表中的某些值,再update这个表(在同一语句中)。这和文章上面的问题一样,也是加了个中间表才可以),网上是这样说的:也就是说将select出的结果再通过中间表select一遍,这样就规避了错误。注意,这个问题只出现于mysql,mssql和oracle不会出现此问题。
这样感觉效率会很低的吧,请教大神高效率的sql


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值