2

我有一个表格,其中显示了产品 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

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

4

3 回答 3

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,则仅使用在唯一键上有重复的行中的第一行,删除其他冲突的行。不正确的值将被截断为最接近的匹配可接受值。

于 2013-05-24T08:30:58.460 回答
1

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

  1. 创建临时表

    创建表 temp_table_name 作为 select distinct * from table_name;

  2. 放下你的桌子

    删除表表名;

  3. 重命名临时表。

    将 temp_table_name 重命名为 table_name;

于 2013-05-24T08:30:49.033 回答
1

继我之前关于唯一 ID 字段的评论之后,我尝试在一个语句中提出一种正常的 SQL 方式来执行此操作,并且如果您有这样的 ID,则无需临时更改表。

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 或德瓦特。但是,如果这是一个可能发生但只是偶尔需要清理的常规问题,那么添加唯一无意义的 id 并使用此 SQL 可能是值得的。

于 2013-05-24T09:52:20.203 回答