从mysql表中删除所有重复项

时间:2013-05-24 08:27:10

标签: mysql deduplication

我有一张表格,显示产品ID以及给出的次数,1星级,2星级,3星级,4星级和5星级,经过客户评价以及该产品的平均评分。此表中出现了一些重复的行。如何删除完全重复的行,例如ProductId 1196585.该表的一个例子如下。

ProductId  | rate1 | rate2 | rate3 | rate4 | rate5 | aveRate

1294518    |   4   |   1   |   0   |   0   |   0   |   1

9226582    |   0   |   0   |   3   |   0   |   0   |   3

3946583    |   0   |   0   |   0   |   1   |   0   |   4

7392588    |   1   |   0   |   0   |   0   |   6   |   5

1196585    |   0   |   0   |   2   |   3   |   9   |   5

1196585    |   0   |   0   |   2   |   3   |   9   |   5

为了澄清我想修改表格,我会先复制一下。

3 个答案:

答案 0 :(得分:3)

最简单的方法是使用带有 IGNORE 选项的ALTER TABLE语句添加唯一键 -

ALTER IGNORE TABLE table_name
  ADD UNIQUE INDEX (ProductId, rate1, rate2, rate3, rate4, rate5, aveRate);

从文档 - IGNORE是标准SQL的MySQL扩展。如果新表中的唯一键上存在重复项,或者启用了严格模式时出现警告,它将控制ALTER TABLE的工作方式。如果未指定IGNORE,则复制将中止并在发生重复键错误时回滚。如果指定了IGNORE,则只对第一行使用唯一键上具有重复项的行,将删除其他冲突行。不正确的值将被截断为最接近的匹配可接受值。

答案 1 :(得分:1)

按照以下步骤完成此任务。

  1. 创建临时表

    将table temp_table_name创建为select table * from table_name;

  2. 放下你的桌子

    drop table table_name;

  3. 重命名临时表。

    将temp_table_name重命名为table_name;

答案 2 :(得分:1)

除了我之前关于一个唯一ID字段的评论之外,我还试图在一个语句中提出一种正常的SQL方式来执行此操作,如果你有这样的id,则无需临时更改表。< / p>

DELETE ProductRate 
FROM ProductRate
INNER JOIN (
SELECT id, ProductId, rate1, rate2, rate3, rate4, rate5, aveRate, 
@Counter := (
            CASE
                WHEN ProductId != @ProductId THEN 0
                WHEN rate1 != @rate1 THEN 0
                WHEN rate2 != @rate2 THEN 0
                WHEN rate3 != @rate3 THEN 0
                WHEN rate4 != @rate4 THEN 0
                WHEN rate5 != @rate5 THEN 0
                WHEN aveRate != @aveRate THEN 0
                ELSE @Counter + 1
            END
            ) AS RecCounter,
@ProductId:=ProductId, 
@rate1:=rate1, 
@rate2:=rate2, 
@rate3:=rate3, 
@rate4:=rate4, 
@rate5:=rate5, 
@aveRate:=aveRate
FROM ProductRate,
(SELECT @Counter:=0, @ProductId:=0, @rate1:=0, @rate2:=0, @rate3:=0, @rate4:=0, @rate5:=0, @aveRate:=0) Deriv1
ORDER BY ProductId, rate1, rate2, rate3, rate4, rate5, aveRate) Deriv2
ON ProductRate.id = Deriv2.id
WHERE Deriv2.RecCounter >0

请注意,这假设您在表格上有唯一的ID。您可以通过以下方式轻松添加: -

ALTER TABLE `ProductRate` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST

我只是出于兴趣和一次性工作,我很乐意使用Er的建议。 Nikhil Agrawal或Devart。但是,如果这是一个常见的问题,可能会发生,但只是偶尔需要清理,添加唯一无意义的ID并使用此SQL可能是值得的。