0

我输入了一个查询,在我的数据库中引入了一些重复项。桌子是直的。

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

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

我的问题是,如何删除重复条目而无需手动操作?我想使用上面的查询来生成至少需要删除一次的条目列表。这样,表 foo 中只存在一个版本的“短语”。

4

4 回答 4

2

这将在每个短语中保留一行(ID 最低的那一行)。

DELETE FROM foo
WHERE id NOT IN (
    SELECT id FROM (
        SELECT MIN(id) id
        FROM foo
        GROUP BY phrase
    ) _
);

正如 dan 在评论中指出的那样,使用 MySQL,您需要那个奇怪的内部查询。

于 2012-11-13T22:10:14.130 回答
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 语句,以删除超过一个的重复项。

于 2012-11-13T22:07:42.630 回答
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;
于 2012-11-13T22:12:39.613 回答
0

您可以执行 JOIN 并决定是要删除第一个(最小)还是最后一个(最大)重复项。

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 个重复项,则需要多次运行它。

于 2012-11-13T22:13:32.317 回答