我一直在想办法做这样的事情Delete all records except the most recent one?
但我无法将它应用到我的情况中。
我的情况:
https://gyazo.com/178b2493e42aa4ec4e1a9ce0cbdb95d3
SELECT * FROM dayz_epoch.character_data;
CharacterID, PlayerUID, InstanceID, Datestamp, LastLogin, Alive, Generation
5 |76561198068668633|11|2016-05-31 18:21:37|2016-06-01 15:58:03|0|1
6 |76561198068668633|11|2016-06-01 15:58:20|2016-10-08 21:30:36|0|2
7 |76561198068668633|11|2016-10-08 21:30:52|2016-10-09 18:59:07|1|3
9 |76561198010759031|11|2016-10-08 21:48:32|2016-10-08 21:53:31|0|2
10|76561198010759031|11|2016-10-08 21:53:55|2016-10-09 19:07:28|1|3
(看上面的图片)所以我目前正在尝试一种更好的方法来从我的DayZ Epoch服务器的数据库中删除尸体。我需要一个代码来删除Where ALIVE=0,如果同一个PlayerUID有另一个实例,而它的ALIVE=1。
代码可以做的另一件事是删除所有玩家,除了每个PlayerUID最近的一个。我希望这有道理。很难解释。第一个环节对我来说更好。
但基本上,我想删除任何死的玩家,现在有一个活着的玩家与相同的PlayerUID。如果我更擅长编码,我可以看到许多我可以使用的变量,比如PlayerUID(必须)、Datestamp、Alive和generation。可能只需要其中的两个,一个是PlayerUID。
多谢。
对我来说,最简单的方法是:按PlayerUID排序,对于每个PlayerUID,删除除(?)最新的日期戳。
这将使玩家的统计数据远离他们的尸体,以防他们在调用此脚本之前没有创建新角色。
最佳答案
所以基本上,你需要确保在一个玩家的插入(或者更新为1)中,你删除了所有先前的(只是以防万一,正常情况下应该只有一个)玩家的PlayerUID与新玩家相同。
最简单的方法是创建一个触发器,该触发器将在插入之前运行(如果可能的话,在更新时将活动更新为1以修改一个触发器)。使用新播放机的UID对表中的特定UID运行删除。就这么简单;)
扳机应该是这样的
Create trigger CLEAR_PLAYER
before insert on dayz_epoch.character_data
For Each Row
Delete from dayz_epoch.character_data
where PlayerUID = NEW.PlayerUID
and Alive = 0 --Just in case, but what will happen if there where a line with Alive = 1 ?
这将在表中插入之前执行(因此不要删除新的)。这将删除插入行中
dayz_epoch.character_data
的每一行。如果要添加一些安全性,可以在条件中添加PlayerUID
。编辑:
很久没写触发器了,但我用official doc作为提醒。如果你需要看一看。
关于mysql - Arma 2 DayZ Epoch SQL尸体清洁剂,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39971004/