可能重复:
如何使用 SQL 删除重复行?
我有一个包含记录的表,我想删除所有重复的记录
DELETE FROM 'table'
WHERE 'field' IN
(
SELECT 'field' FROM 'table' GROUP BY 'field'
HAVING (COUNT('field')>1)
)
为什么这不起作用?
可能重复:
如何使用 SQL 删除重复行?
我有一个包含记录的表,我想删除所有重复的记录
DELETE FROM 'table'
WHERE 'field' IN
(
SELECT 'field' FROM 'table' GROUP BY 'field'
HAVING (COUNT('field')>1)
)
为什么这不起作用?
也许您可以使用命令进行探索,DISTINCT
以仅选择基于字段的唯一记录。
您可以创建一个基于唯一条目的新表。举个例子...
CREATE TABLE nonDuplicates
SELECT DISTINCT * FROM yourTable group by field
这给了你不止一个结果:-
SELECT field FROM `table`
GROUP BY field
HAVING (COUNT('field)>1
尝试通过以下方式改变这一点:
SELECT TOP 1 field
FROM `table`
GROUP BY field
HAVING (COUNT(field)>1
首先获取所有重复项并将它们存储在数组中。
SELECT field
FROM `table`
GROUP BY field
HAVING COUNT('field') > 1
现在做你的 php 来保存一个你想要的结果,然后执行
DELETE
FROM `table`
WHERE field IN (your values) AND field != savedID
MySQL 有一个非常令人讨厌的限制,它不能使用在子选择中正在更新/删除/插入的表。
但是您可以通过加入要删除的表来解决此问题(而不是使用子选择)。
假设您的表中有某种唯一标识符(我假设id
以下语句中有一个列):
DELETE d
FROM table_with_duplicates d
JOIN (
SELECT min(id) as min_id, field
FROM table_with_duplicates
GROUP BY field
) keep ON keep.field = d.field
AND keep.min_id <> d.id;
这将为每个重复项保留一行(列中具有最低值的id
那一行)。
如果要删除所有重复的行(至少不保留一个),只需删除AND keep.min_id <> d.id
条件即可。
编辑
如果您没有唯一列,但想要删除所有重复项(不保留至少一行),那么您可以使用:
DELETE d
FROM table_with_duplicates d
JOIN (
SELECT field
FROM table_with_duplicates
GROUP BY field
HAVING count(*) > 1
) del ON del.field = d.field;