0

我们有 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

我怎样才能做到这一点?

4

3 回答 3

2

假设您有一个名为“表”的表,其中有重复的记录。首先,您必须按要删除重复项的列进行分组。但我没有使用分组方式进行操作。我正在编写自联接而不是编写嵌套查询创建临时表

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 值的行或

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 结果,则查询成功。

于 2015-09-21T13:15:17.837 回答
0

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

然后发出

将 IGNORE 插入到 select * from TableWithDuplicates

你会得到一个没有重复的临时表。

然后通过加入表从原始表(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 ;

抱歉,我没有测试此代码

于 2013-07-14T11:56:23.723 回答
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 演示

于 2013-07-14T12:03:38.330 回答