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 |
+------+----------+
| 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 |
+-----+
| 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 |
+----+------+
+----+------+
| 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