MySQL:尽可能删除重复行

时间:2012-11-13 22:05:16

标签: mysql

我输入的查询在我的数据库中引入了一些重复项。表格很简单。

它有一个id(int)列和一个varchar(255)的短语列。为了查找重复项,我的查询如下所示:

SELECT phrase from foo GROUP BY phrase HAVING (count(phrase) > 1)

我的问题是,如何在不手动操作的情况下删除重复的条目?我想使用上面的查询来生成至少需要删除一次的条目列表。这种方式只有一个版本的短语'表foo中存在。

4 个答案:

答案 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,则需要多次运行。