MySQL单表多字段去重
1、编写查重语句
SELECT
a.字段1,
a.字段2
FROM
表名 as a
GROUP BY
a.字段1,
a.字段2
HAVING
Count(*) > 1
-- 这样即可得到多字段重复数据
2、更新表,去重
做这一步之前我们要了解mysql是不允许表"自己更新自己的",一般这样在sql中会报“You can’t specify target table ‘a’ for update in FROM clause”错误,即“你不能在FROM子句中指定更新的目标表’a’ ”
----- 因此,想更新表a,我们有三种方法
-- 方法一:设置局部变量,即声明标识,赋值进行处理
-- 方法二:将数据去重后存入临时表中,drop原表,在重新将临时表中的数据放到原表中(即重新创建),最后删除临时表。
-- 方法三:为该表设置一个"假表",这样mysql就会继续运行下去
-- 在这我直接讲方法三 (原因是一我运行不了,二我不想用,因为删除原表在公司服务器中容易出现一些错误异常):
-- 该方法比较稳妥
Delete From table_name As a
Where (a.字段1, a.字段2) in
(Select ub.字段1, ub.字段2 FROM
(
Select cr.字段1, cr.字段2 From table_name As cr Group By cr.字段1, cr.字段2 Having Count(*) > 1
) As ub
)
And a.id In
(
Select* From
(
Select min(c.id) From table_name As c Group By c.字段1, c.字段2 Having Count(*)>1
) As bt
)
-- 释义:1、 min(c.id):即相同情况下,取最小的id
-- 2、 table_name:表名
-- 注意:如果不加别名容易报 “Every derived table must have its own alias”错误,即“每个派生表必须有自己的别名”
希望能帮助正在这一步遇到困难的人