根据列数据删除重复的MySQL行

时间:2015-07-23 00:35:01

标签: mysql

我有一个名为sg的表,其中包含以下列:
player_uuidplayer_namecoinskillsdeathswins

但是,我遇到了导致一些重复行并且其中一些行被修改的问题。所以,我想知道如何删除旧数据的行。那说......

如何删除player_uuid相同的重复行?但我只想删除coinskillsdeathswins小于其重复的行。

示例数据:http://i.stack.imgur.com/Xieod.png
在这种情况下,我想保留46个死亡行并删除43个死亡行。

1 个答案:

答案 0 :(得分:0)

由于数据的结构方式,未能提出单个删除语句:3删除语句:

它的工作方式是:查找给定UUID是否有多行,并确定要保留哪一行(给定列的最大值),然后重新连接自身并确定哪些行不是保存,存储在临时表中,并从主数据表(称为someTable)中删除该临时表中标记的所有内容。这种方法的好处是:如果你有超过1个重复(3,4,5行到无穷大),它们也将被删除。

CREATE TEMPORARY TABLE tempTable AS
SELECT a.player_uuid, a.kills, b.keepRow
FROM someTable a
LEFT JOIN (SELECT MAX(kills) AS kills, player_uuid, 1 AS keepRow
  FROM sometable
  GROUP BY player_uuid
  HAVING COUNT(*)>1
) b ON a.player_uuid=b.player_uuid AND a.kills=b.kills
WHERE b.keepRow!=1;

DELETE a.* FROM someTable a, tempTable b 
  WHERE a.player_uuid=b.player_uuid AND a.kills=b.kills;

重复其他列(winscoinsdeaths),将所有kills替换为其他列名称。

始终首先测试删除代码:)

另外:当你在场时:

在一个唯一的索引处,以防止再次发生这种情况:

CREATE UNIQUE INDEX idx_st_nn_1 ON someTable(player_uuid);

当您尝试插入错误记录时,您的代码只会收到错误。在这种情况下处理插入的最佳代码是:

INSERT INTO someTable(player_uuid,kills) VALUES ('someplayer',1000) 
     ON DUPLICATE KEY UPDATE kills=1000;

还有一些时间指示器列也有帮助:那么只需要执行一次删除:

ALTER TABLE someTable ADD COLUMN (last_updated TIMESTAMP);

时间戳自动更新它们,因此不需要更改代码。