MySQL:尽可能删除重复的行
我输入了一个查询,在我的数据库中引入了一些重复项。这张桌子笔直向前 它有一个id(int)列和一个短语列varchar(255)。为了查找重复项,我的查询如下所示:MySQL:尽可能删除重复的行,mysql,Mysql,我输入了一个查询,在我的数据库中引入了一些重复项。这张桌子笔直向前 它有一个id(int)列和一个短语列varchar(255)。为了查找重复项,我的查询如下所示: 按短语(计数(短语)>1)从foo组中选择短语 我的问题是,如何删除重复条目而不必手动执行?我想使用上面的查询生成至少需要删除一次的条目列表。这样,表foo中只存在一个版本的“短语”。您应该使用: SELECT max(id) from foo GROUP BY phrase HAVING (count(phrase) > 1
按短语(计数(短语)>1)从foo组中选择短语
我的问题是,如何删除重复条目而不必手动执行?我想使用上面的查询生成至少需要删除一次的条目列表。这样,表foo中只存在一个版本的“短语”。您应该使用:
SELECT max(id) from foo GROUP BY phrase HAVING (count(phrase) > 1)
确定需要删除哪些ID
要删除条目,可以执行以下操作:
delete from foo where id in (select id from (SELECT max(id) from foo GROUP BY phrase HAVING (count(phrase) > 1)) foo);
您将能够多次执行delete语句,以删除多个重复项。这将为每个短语保留一行(ID最低的一行)
DELETE FROM foo
WHERE id NOT IN (
SELECT id FROM (
SELECT MIN(id) id
FROM foo
GROUP BY phrase
) _
);
正如dan在评论中指出的,使用MySQL,您需要一个奇怪的内部查询。您需要创建一个临时表,添加唯一值,只添加一个重复值,然后将临时表重命名为原始表
create table tmp like foo;
alter table tmp add unique (phrase);
insert into tmp select * from foo
on duplicate key update phrase=ifnull(phrase, values(phrase));
rename table foo to deleteme, tmp to foo;
drop table deleteme;
您可以执行联接并决定是否要删除第一个(最小)副本或最后一个(最大)副本
DELETE phrase FROM phrase JOIN
(SELECT max(id),COUNT(id) cnt from foo GROUP BY phrase
HAVING cnt>1) AS dups
ON phrase.id=dups.id
如果每条记录有1个以上的副本,则需要多次运行它。如果有3个短语怎么办?您的查询只会删除其中一个。@VincentSavard他将能够多次执行delete语句。如果他有N个短语呢?他应该无限期地执行吗?@VincentSavard因为OP说他错误地创建了另一组重复项,他不会有N个条目。如果你有多个短语重复项,你的解决方案是正确的,但你需要使用临时查询(见我的答案),因为不能在from子句中指定更新的目标表'foo'。丹:是的,我忘了MySQL做了一些奇怪的事情。谢谢,我将编辑我的帖子。