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


(1)mysql 数据库中删除某一列值重复的全部行(一个笔试题)

如果要求是多个字段重复的就在group后把所有要求重复的字段写上去

表名:zp

数据如下(都是int型的 sal:工资)




mysql根据某个字段去重留下权重高的 mysql根据某一列去除重复_表名



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



mysql根据某个字段去重留下权重高的 mysql根据某一列去除重复_mysql根据某个字段去重留下权重高的_02




说下我的思路吧:


主要分为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字段中值相同的重复行,且只留一行重复数据


 删除前(原表)如下:


mysql根据某个字段去重留下权重高的 mysql根据某一列去除重复_字段_03


删除后:


mysql根据某个字段去重留下权重高的 mysql根据某一列去除重复_mysql_04


删除语句: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