我有一个包含许多重复记录的表:
shop
ID tax_id
1 10
1 10
1 11
2 10
2 12
2 10
2 10
Run Code Online (Sandbox Code Playgroud)
我想删除所有重复的记录而不创建临时表.更新查询后,该表应如下所示:
shop
ID tax_id
1 10
1 11
2 10
2 12
Run Code Online (Sandbox Code Playgroud)
这是一个就地解决方案(但不是一个班轮)
找出最大ID:
select max(id) as maxid
from shop;
Run Code Online (Sandbox Code Playgroud)
记住这个价值.假设它等于1000;
使用偏移量重新插入唯一值:
insert into shop (id, tax_id)
select distinct id + 1000, tax_id
from shop;
Run Code Online (Sandbox Code Playgroud)
删除旧值:
delete from shop
where id <= 1000;
Run Code Online (Sandbox Code Playgroud)
恢复正常ID:
update shop
set id = id - 1000;
Run Code Online (Sandbox Code Playgroud)
利润!
工作方案.
//Sql query to find duplicates
SELECT id, tax_id, count(*) - 1 AS cnt
FROM shop
GROUP BY id
HAVING cnt > 1
--- res
+------+--------+-----+
| id | tax_id | cnt |
+------+--------+-----+
| 1 | 10 | 2 |
| 2 | 10 | 3 |
+------+--------+-----+
//Iterate through results with your language of choice
DELETE
FROM shop
WHERE id=<res id>
AND tax_id=<res tax_id>
LIMIT <cnt - 1>
---res (iterated)
+------+--------+
| id | tax_id |
+------+--------+
| 1 | 10 |
| 1 | 11 |
| 2 | 12 |
| 2 | 10 |
+------+--------+
Run Code Online (Sandbox Code Playgroud)
这两个查询将需要一小段php才能执行删除操作
$res = mysql_query("SELECT id, tax_id, count(*) - 1 AS cnt
FROM shop
GROUP BY id
HAVING cnt > 1")
while($row = mysql_fetch_assoc($res)){
mysql_query("DELETE
FROM shop
WHERE id=".$row['id']."
AND tax_id=". $row['tax_id']."
LIMIT ".$row['cnt'] -1 . ");
}
Run Code Online (Sandbox Code Playgroud)
编辑:最近重新审视了这个值,这是使用临时列的替代解决方案,无需使用脚本语言.
ALTER TABLE shop ADD COLUMN place INT;
SET @i = 1
UPDATE shop SET place = @i:= @i + 1;
DELETE FROM shop WHERE place NOT IN (SELECT place FROM items GROUP BY id, tax_id);
ALTER TABLE shop DROP COLUMN place;
Run Code Online (Sandbox Code Playgroud)