情景:一个用户资料表的数据是销售员工上传的。其中部门客户的数据会重复。现在要查询和删除部分数据。(区别重复数据的问题是在手机号)
数据表 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
上一篇: thinkphp5分页传递参数...
下一篇: PHP时间转换...