我有一张表格,显示产品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
为了澄清我想修改表格,我会先复制一下。
答案 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)
按照以下步骤完成此任务。
创建临时表
将table temp_table_name创建为select table * from table_name;
放下你的桌子
drop table table_name;
重命名临时表。
将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可能是值得的。