我输入的查询在我的数据库中引入了一些重复项。表格很简单。
它有一个id(int)列和一个varchar(255)的短语列。为了查找重复项,我的查询如下所示:
SELECT phrase from foo GROUP BY phrase HAVING (count(phrase) > 1)
我的问题是,如何在不手动操作的情况下删除重复的条目?我想使用上面的查询来生成至少需要删除一次的条目列表。这种方式只有一个版本的短语'表foo中存在。
答案 0 :(得分:2)
这将为每个短语保留一行(ID最低的行)。
DELETE FROM foo
WHERE id NOT IN (
SELECT id FROM (
SELECT MIN(id) id
FROM foo
GROUP BY phrase
) _
);
正如丹在评论中指出的那样,使用MySQL你需要那种奇怪的内部查询。
答案 1 :(得分:0)
您应该使用:
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语句,以删除多于一个的重复项。
答案 2 :(得分:0)
您需要创建一个临时表,添加唯一值,只添加其中一个重复值,然后将临时表重命名为原始表。
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;
答案 3 :(得分:0)
您可以进行加入并决定是否要删除第一个(最小)或最后一个(最大)副本。
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,则需要多次运行。