删除重复记录而不创建临时表

Lin*_*ina 2 php mysql

我有一个包含许多重复记录的表:

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)

Ser*_*sev 5

这是一个就地解决方案(但不是一个班轮)

找出最大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)

利润!


CBu*_*Bus 5

工作方案.

//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)