Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:尽可能删除重复的行_Mysql - Fatal编程技术网

MySQL:尽可能删除重复的行

MySQL:尽可能删除重复的行,mysql,Mysql,我输入了一个查询,在我的数据库中引入了一些重复项。这张桌子笔直向前 它有一个id(int)列和一个短语列varchar(255)。为了查找重复项,我的查询如下所示: 按短语(计数(短语)>1)从foo组中选择短语 我的问题是,如何删除重复条目而不必手动执行?我想使用上面的查询生成至少需要删除一次的条目列表。这样,表foo中只存在一个版本的“短语”。您应该使用: SELECT max(id) from foo GROUP BY phrase HAVING (count(phrase) > 1

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

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

按短语(计数(短语)>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做了一些奇怪的事情。谢谢,我将编辑我的帖子。