我有一个名为sg
的表,其中包含以下列:
player_uuid
,player_name
,coins
,kills
,deaths
和wins
但是,我遇到了导致一些重复行并且其中一些行被修改的问题。所以,我想知道如何删除旧数据的行。那说......
如何删除player_uuid
相同的重复行?但我只想删除coins
,kills
,deaths
或wins
小于其重复的行。
示例数据:http://i.stack.imgur.com/Xieod.png
在这种情况下,我想保留46个死亡行并删除43个死亡行。
答案 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;
重复其他列(wins
,coins
,deaths
),将所有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);
时间戳自动更新它们,因此不需要更改代码。