5

可能重复:
如何使用 SQL 删除重复行?

我有一个包含记录的表,我想删除所有重复的记录

DELETE FROM 'table'
WHERE 'field' IN 
(
SELECT 'field' FROM 'table' GROUP BY 'field'
HAVING (COUNT('field')>1)
)

为什么这不起作用?

4

4 回答 4

6

也许您可以使用命令进行探索,DISTINCT以仅选择基于字段的唯一记录。

您可以创建一个基于唯一条目的新表。举个例子...

CREATE TABLE nonDuplicates  
SELECT DISTINCT * FROM yourTable group by field
于 2013-01-31T15:10:40.220 回答
1

这给了你不止一个结果:-

SELECT field FROM `table`
GROUP BY field
HAVING (COUNT('field)>1

尝试通过以下方式改变这一点:

SELECT TOP 1 field
FROM `table`
GROUP BY field 
HAVING (COUNT(field)>1
于 2013-01-31T14:56:59.230 回答
0

首先获取所有重复项并将它们存储在数组中。

SELECT field 
FROM `table`
GROUP BY field
HAVING COUNT('field') > 1

现在做你的 php 来保存一个你想要的结果,然后执行

DELETE 
FROM `table`
WHERE field IN (your values) AND field != savedID
于 2013-01-31T15:09:02.850 回答
0

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;
于 2013-01-31T15:10:21.450 回答