【问题标题】:Mysql delete duplicate comments?mysql删除重复评论?
【发布时间】:2015-02-01 18:45:23
【问题描述】:

我想清理用户已发布两次(或更多)相同 cmets 的 cmets 表(1M 行)上的重复内容。但是,我想保留任何重复评论的一个实例。

这是我提出的用于查找和分组这些 cmets 的查询:

SELECT author, body, COUNT(*) as count
FROM  db.comment
GROUP BY body
HAVING COUNT(*) > 1;

但不知道如何删除重复的行而只保留一个不变。 我见过类似的问题,但没有一个对我有用。所以感谢你的提示。

更新:

mysql> describe comment;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |
| created | datetime    | NO   |     | NULL    |                |
| author  | varchar(60) | NO   |     | NULL    |                |
| body    | longtext    | NO   |     | NULL    |                |
| post_id | int(11)     | NO   | MUL | NULL    |                |
+---------+-------------+------+-----+---------+----------------+

【问题讨论】:

标签: mysql duplicate-removal


【解决方案1】:

与其他 DBMS 不同,MySQL 可以从表中选择所有字段,但仅按其中一个字段进行分组。在这种情况下,只会选择每个组的第一条记录。

分两步完成工作:

保存 ID 以保留在临时表中:

INSERT INTO temp_comment(id)
SELECT id
FROM db.comment
GROUP BY author, body

删除除已保存行之外的所有行:

DELETE FROM db.comment WHERE id NOT IN (SELECT id FROM temp_comment);

当然,您需要temp_comment 表存在。

【讨论】:

  • 那将是一次性的。请您详细说明如何操作?
  • 嵌套查询在 mysql 5.5 上不起作用,但是 temp_comment 技巧就像一个魅力。请编辑您的答案,我会接受。
【解决方案2】:

这是你想要的吗?

SELECT * FROM comments WHERE id NOT IN (
  SELECT id
  FROM  comments
  GROUP BY author,body
  HAVING COUNT(*) > 1
 )
AND author IN(
  SELECT author
  FROM  comments
  GROUP BY author,body
  HAVING COUNT(*) > 1
  )
AND body IN(
  SELECT body
  FROM  comments
  GROUP BY author,body
  HAVING COUNT(*) > 1
  );

delete重复的行,将SELECT *更改为DELETE

SQL Fiddle Demo

更新

为了提高查询性能,你可以试试这个:

SELECT * FROM comments c
INNER JOIN 
(
  SELECT id,author,body
  FROM  comments
  GROUP BY author,body
  HAVING COUNT(*) > 1
 ) AS t
ON c.id NOT IN(t.id) AND c.author IN(t.author) AND c.body IN(t.body)

【讨论】:

  • @supermario 我更新了答案。提高查询性能。不确定那是你想要的。但它比上一个查询更快(当然结果相同)
  • 恐怕第二个查询也不快。这两个查询都花费了很长时间并且没有返回任何内容。
猜你喜欢
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 2016-07-31
相关资源
最近更新 更多