我输入了一个查询,在我的数据库中引入了一些重复项。桌子是直的。
它有一个 id (int) 列和一个短语列,即 varchar(255)。为了查找重复项,我的查询如下所示:
SELECT phrase from foo GROUP BY phrase HAVING (count(phrase) > 1)
我的问题是,如何删除重复条目而无需手动操作?我想使用上面的查询来生成至少需要删除一次的条目列表。这样,表 foo 中只存在一个版本的“短语”。
我输入了一个查询,在我的数据库中引入了一些重复项。桌子是直的。
它有一个 id (int) 列和一个短语列,即 varchar(255)。为了查找重复项,我的查询如下所示:
SELECT phrase from foo GROUP BY phrase HAVING (count(phrase) > 1)
我的问题是,如何删除重复条目而无需手动操作?我想使用上面的查询来生成至少需要删除一次的条目列表。这样,表 foo 中只存在一个版本的“短语”。
这将在每个短语中保留一行(ID 最低的那一行)。
DELETE FROM foo
WHERE id NOT IN (
SELECT id FROM (
SELECT MIN(id) id
FROM foo
GROUP BY phrase
) _
);
正如 dan 在评论中指出的那样,使用 MySQL,您需要那个奇怪的内部查询。
你应该使用:
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 语句,以删除超过一个的重复项。
您需要创建一个临时表,添加唯一值,仅添加一个重复值,然后将临时表重命名为原始表。
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;
您可以执行 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 个重复项,则需要多次运行它。