【原创】 MySQL删除重复数据
栏目:PHP  作者:隆航  阅读:(380)

情景:一个用户资料表的数据是销售员工上传的。其中部门客户的数据会重复。现在要查询和删除部分数据。(区别重复数据的问题是在手机号)

数据表 people

//字段:id 主键 ; peoname 名称 ; mobile 手机号 ; from 上传人 ...

首先是查询重复数据:

SELECT * FROM people WHERE mobile IN ( SELECT mobile FROM people GROUP BY mobile HAVING count(mobile) );

只保留其中的一条数据

DELETE FROM people WHERE mobile IN ( SELECT a.* FROM ( SELECT mobile FROM people GROUP BY mobile HAVING count(mobile) > 1 ) a ) AND id NOT IN (  SELECT b.* FROM ( SELECT min(id) FROM people GROUP BY mobile HAVING count(mobile) > 1) AS b )

这里的子孙查询的写法是因为,如果直接在更新的后面跟上本身的子查询会报错。1093,所以这里用的孙查询。

这里的ThinkPHP执行是execute,query的话会报错,而且没有提示错误原因。这是一个坑

同理,假如这里我们遇到的是多个条件来去重呢?

一样的做法,查询重复数据

SELECT * FROM people p WHERE (a.mobile,a.peoname) IN ( SELECT mobile,peoname FROM people GROUP GROUP mobile,peoname HAVING count(*) > 1 )

只保留其中一条数据

DELETE FROM people p WHERE (a.mobile,a.peoname) IN ( SELECT mobile,peoname FROM people GROUP  GROUP mobile,peoname HAVING count(*) > 1) AND id NOT IN ( SELECT MIN(id) FROM people GROUP GROUP mobile,peoname  HAVING count(*)>1 )

附带一条不常用的SQL

消除一个字段的左边的第一位:

update tableName set [Title]=Right([Title],(length([Title])-1)) where Title like '博客%'

消除一个字段的右边的第一位:

update tableName set [Title]=left([Title],(length([Title])-1)) where Title like '%博客'

2016年11月29日16:41:47更新

新版的mysql是length 而不是 len



胡德杰
#210

   胡德杰     2016-12-16 12:48    Win 7      安徽省蚌埠市

从来不敢动数据库,呵呵,技术太烂!

admin

   admin     12-22 10:19    回复 @胡德杰 中说到:

sql只要不是一次删除很多数据的,没啥影响的。

慕轲博客
#206

   慕轲博客     2016-11-28 13:39    Win 7      上海

我一刷新就出来一篇新博文,很实用,不错!!!

admin

   admin     11-28 22:33    回复 @慕轲博客 中说到:

哈哈~欢迎来访

昵称
邮箱
域名
  记住 通知博主
验证码

  程序相关

站点版本:青春博客-V 2.1.0

开源版本:青春博客-Beta v2.0

 下载  在线支付  在线工具  在线音乐

  随机文章