思路:
1. 查询所有重复记录,保留其中id最小的一个。(根据重复条件分组,如 group by mobile,根据需求选择要保留的那一个)
2. 自连接,使用重复记录条件作为连接条件(如根据手机号码去重,期望一个手机号仅对应一条记录,则使用手机号作为连接条件)
3. 删除除保留的记录之外的所有记录,如选择保留ID为最小的那条记录,则删除所有大于该id的所有记录。
根据思路编写的SQL:
DELETE mst
FROM
m_staff mst
LEFT JOIN (
SELECT
min( id ) AS id,
phone,
NAME
FROM
m_staff
GROUP BY
phone
HAVING
count( * ) > 1
) mst2 ON mst2.phone = mst.phone
WHERE
mst.id > mst2.id;
上述SQL报错:1093-You can't specify target table 'm_staff' for update in FROM clause, Time: 0.003000s
执行SQL语句时出现这个错误。原因是在更新这个表和数据时又查询了它,而查询的数据又做了更新的条件。
调整为以下写法可执行,原因TODO
DELETE mst
FROM
m_staff mst
LEFT JOIN (
SELECT
min( id ) AS id,
phone,
NAME
FROM
m_staff
GROUP BY
phone
HAVING
count( * ) > 1
) mst2 ON mst2.phone = mst.phone
WHERE
mst.id > mst2.id;