Mysql是否删除重复评论?

Mysql是否删除重复评论?,mysql,duplicate-removal,Mysql,Duplicate Removal,我想清理comments表(1M行)上重复的内容,其中用户发布了两次(或更多)相同的评论。然而,我想保留一个重复评论的实例 以下是我提出的查询,用于查找和分组这些评论: SELECT author, body, COUNT(*) as count FROM db.comment GROUP BY body HAVING COUNT(*) > 1; 但我不知道如何删除重复的行,同时只保留一行不变。 我见过类似的问题,但没有一个对我有效。所以感谢你的提示 更新: mysql> des

我想清理comments表(1M行)上重复的内容,其中用户发布了两次(或更多)相同的评论。然而,我想保留一个重复评论的实例

以下是我提出的查询,用于查找和分组这些评论:

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    |                |
+---------+-------------+------+-----+---------+----------------+

与其他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\u comment
表。

这就是您想要的吗

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
  );
删除
重复的行,请将
选择*
更改为
删除

更新

要提高查询性能,可以尝试以下操作:

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)

您的
注释
表是否有任何类型的唯一id?请参见:可能重复@PeterM No,但它没有。@help您知道该问题是特定于php的。我的网站不是php的,这里的问题是纯sql的,那是一次性的。你能详细说明一下怎么做吗?嵌套查询在mysql 5.5上不起作用,但是临时注释技巧非常有效。请编辑您的答案,我会接受。@supermario我更新了答案。以提高查询性能。我不确定那是你想要的。但是它比上一个查询快(当然结果相同),我担心第二个查询也不快。这两个查询都花费了很长时间,没有返回任何内容。