我有记录的表,我想删除所有重复记录
DELETE FROM 'table'
WHERE 'field' IN
(
SELECT 'field' FROM 'table' GROUP BY 'field'
HAVING (COUNT('field')>1)
)
为什么这不正常吗?
我有记录的表,我想删除所有重复记录
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
这只会起作用,因为MySQL对GROUP BY的处理基本上是不正确的,并且允许这种无效的语法。但它最可能是最快的解决方案。 –
谢谢Peixe它工作得很好! – vdhmartijn
@vdhmartijn:请阅读http://rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html以了解*为什么*它在MySQL中工作以及为什么其他DBMS会拒绝该语句无效。 –
这给你不止一个结果: -
SELECT field FROM `table`
GROUP BY field
HAVING (COUNT('field)>1
尝试到chenge此:
SELECT TOP 1 field
FROM `table`
GROUP BY field
HAVING (COUNT(field)>1
SELECT TOP 1不适用于我..仍然不能正常工作 – vdhmartijn
这是如何删除任何东西的? –
首先获得所有副本,并将它们存储在阵列。
SELECT field
FROM `table`
GROUP BY field
HAVING COUNT('field') > 1
现在做你的PHP保存无论你想要一个结果,然后执行
DELETE
FROM `table`
WHERE field IN (your values) AND field != savedID
感谢您的反馈,但是我的目的是在没有PHP的情况下工作SQL – vdhmartijn
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;
如果我没有ID,是否还有办法解决这个问题? – vdhmartijn
@vdhmartijn:如果你想删除**所有**重复(至少保留一个),那么你可以不使用ID。否则,请参阅peixe的答案。 –
感谢您帮助它现在工作! – vdhmartijn
您是否收到错误消息或查询是否成功运行? –
wouldnt您的查询删除所有字段,包括重复?如果你有两个重复的ID,你的IN()查询将删除这两个。你不想保留至少一条记录吗? – GGio
mysql不允许你更新/删除你选择数据的表格。 –