2016-10-11 7 views
2

Я пытаюсь найти способ сделать что-то вроде этого Delete all records except the most recent one? Но я не смог применить его к моим обстоятельствам.Arma 2 DayZ Epoch SQL очиститель мертвого тела

Мое обстоятельство: 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 и поколение. Вероятно, требуется только 2 из них, один из которых является PlayerUID.

Спасибо, кучка.

Проще всего мне кажется, что это будет что-то вроде: SORT от PlayerUID И ДЛЯ КАЖДОГО ПАНЕЛИ УДАЛИТЬ ВСЕ ЗА ИСКЛЮЧЕНИЕМ (?) Новейшей Datestamp. Это будет держать статистику игрока от их мертвого тела в случае, если они не создадут нового персонажа перед вызовом этого сценария.

+0

Пожалуйста, разместите текстовые данные как текст, а не как скриншот. Эта картина не может быть помещена в инструмент, подобный [SQLFiddle] (http://sqlfiddle.com) для проверки ответов. – tadman

+0

Добавлен текстовый текст. Это как вы этого хотели? – looter809

+0

Это делает его намного более полезным для людей, которые хотят ответить на этот вопрос. – tadman

ответ

0

В общем, вам нужно быть уверенным, что при вставке (или обновлении ALIVE до 1) игрока вы удалили все предыдущие (на всякий случай, нормальный должен быть только один) игрок с тем же PlayerUID, что и новый.

Самый простой способ - создать триггер, который будет запускаться перед вставкой (и в UPDATE, если это возможно, чтобы обновить ALIVE до 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 вставленной строки. Если вы хотите добавить некоторую безопасность, вы можете добавить and Alive= 0 в состояние.

Edit:

Не написать триггер в течение длительного времени, но я использую official doc в качестве напоминания. Посмотрите, если вам нужно.

+0

'Создание триггера CLEAR_PLAYER Перед вставкой на dayz_epoch.character_data Удалить из dayz_epoch.character_data где PlayerUID = NEW.PlayerUID И«ALIVE»= 0 ' – looter809

+0

Это говорит Код ошибки: 1064. У Вас есть ошибка в вашем SQL синтаксиса; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «Удалить из dayz_epoch.character_data, где PlayerUID = NEW.PlayerUID» в строке 2 – looter809

+0

Хорошо, я добавил «Для каждой строки», и он принял его. Скоро проверит и сообщит вам. – looter809