删除mysql中的重复记录

时间:2013-07-14 11:44:29

标签: mysql database

我们有2个表:“post”和“post_extra”

总结“post”表的构造是:id,postdate,title,description

对于post_extra,它们是:eid,news_id,rating,views

第一个表中提交的“id”与第二个表中的“news_id”相关。

桌面上有超过100,000条记录,其中许多都是重复的。我想只保留一条记录并删除具有相同标题的“post”表上的重复记录,然后删除“post_extra”上的相关记录

我在phpmyadmin上运行了这个查询,但是服务器崩溃了。我不得不重新启动它。

DELETE e 
FROM Post p1, Post p2, Post_extra e 
WHERE p1.postdate > p2.postdate 
  AND p1.title = p2.title 
  AND e.news_id = p1.id

我该怎么做?

3 个答案:

答案 0 :(得分:2)

假设您有一个名为'tables'的表,其中包含重复记录。 首先,您必须逐列删除要删除的副本。但是我没有使用group by。我正在编写自联接而不是编写嵌套查询创建临时表

SELECT * FROM `names` GROUP BY title, id having count(title) > 1;

此查询返回带有标题和ID的重复记录数。

在这种情况下,您无需创建临时表。

删除除一条记录以外的重复内容: 在此表中,它应具有自动增量列。我刚刚遇到的可能的解决方案:

DELETE t1 FROM tables t1, tables t2 WHERE t1.id > t2.id AND t1.title = t2.title

如果要保持行具有最低的自动增量id值OR

DELETE t1 FROM tables t1, tables t2 WHERE t1.id < t2.id AND t1.title = n2.title

如果你想保持行具有最高的自动增量id值。

您可以通过给定查询再次选择重复记录来交叉检查您的解决方案:

SELECT * FROM `tables` GROUP BY title, id having count(title) > 1;

如果返回0结果,则查询成功。

答案 1 :(得分:0)

您可以通过在需要检查重复值的字段上创建具有唯一索引的临时表来删除重复记录

然后发出

将IGNORE插入select * from TableWithDuplicates

您将获得一个没有重复的临时表。

然后通过JOIN表

删除原始表中的记录(TableWithDuplicates)

应该是

CREATE TEMPORARY TABLE `tmp_post` (
`id` INT(10) NULL,
`postDate` DATE NULL,
`title` VARCHAR(50) NULL,
`description` VARCHAR(50) NULL, UNIQUE INDEX `postDate_title_description`        (`postDate`, `title`, `description`) );

INSERT IGNORE INTO tmp_post
SELECT id,postDate,title,description
FROM post ;

DELETE post.*
FROM post
LEFT JOIN tmp_post tmp ON tmp.id = post.id
WHERE tmp.id IS NULL ;

抱歉,我没有测试过此代码

答案 2 :(得分:0)

这会使每个id

的条目保持最低title
DELETE p, e
FROM Post p
left join Post_extra e on e.news_id = p.id
where id not in
(
   select * from 
   (
      select min(id) 
      from post
      group by title
   ) x
)

SQLFiddle demo