Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 0
JustBullet

Немного о Запросах в БД.

Ребят, возник такой вопрос, решил заново перебрать процедуры. Когда то давно я их взял и добавил как советовал автор но сегодня я решил вернуться и посмотреть что же там было и был удивлен немного...

 

предположим есть запрос на удаление техники раздамаженной более 80%:

 

DELETE FROM object_data WHERE Damage > 0.8;
 

 

 

и есть запрос который наносит дамаг любой технике и постройкам в 10% раз в 3 дня

 

UPDATE `object_data` SET `Damage`=0.1 WHERE `ObjectUID` <> 0 AND `CharacterID` <> 0 AND `Datestamp` < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 DAY) AND ( (`Inventory` IS NULL) OR (`Inventory` = '[]') );
 

 

вроде бы казалось что все правильно но как выясняется нет...

дословно говоря этот запрос что делает - не наносит Damage а устанавливает Damage всей техники и постройкам, предположим проходит 3 дня, техника или постройка имеет Damage больше 0.7 предположим и вроде бы казалось что через несколько дней она должна удалиться но это не так, этот запрос судя по невооруженному взгляду опять установит ей Damage = 0.1 и техника или постройка опять будет иметь урон в 0.1 за место 0.8...

 

В чем соль?  :surprised:

 

далее поглядев как можно записывать запросы я выяснил что можно сделать так:

UPDATE `object_data` SET `Damage`=`Damage`+ 0.1;

Это уже ближе к правде но и тут "коса нашла на камень". `Damage` = 0.0 то функция не сработает, но ведь нам надо как то нанести урон, что бы в конечном счете сработал самый верхний запрос...

 

как задать - если урона нет то наносится урон а если есть то плюсуется но и тут есть подводный камень, как можно плюсануть к нулю? никак, тут как то надо вначале значение у которого ноль, присвоить 1 и плюсануть 0.1 потом минусануть 1, бред не так ли?... что делать я хз))) сломал голову. :wacko:

Edited by JustBullet (see edit history)

Share this post


Link to post
Share on other sites

9 answers to this question

Recommended Posts

  • 0

В общем придумал как сделать:

 

 

UPDATE `object_data`
SET `Damage` = 0.1
WHERE `LastUpdated` < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 DAY)
AND `Datestamp` < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 DAY)
AND (
        (`Inventory` IS NULL)
        OR (`Inventory` = '[]')
        OR (`Inventory` = '[[[],[]],[[],[]],[[],[]]]')
        OR (`Inventory` = '[[[],[]],[[],[]],[[],[]],0]')
)
AND `Damage` < 0.1;


UPDATE `object_data`
SET `Damage`=`Damage`+0.1
WHERE `LastUpdated` < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 DAY)
AND `Datestamp` < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 DAY)
AND (
        (`Inventory` IS NULL)
        OR (`Inventory` = '[]')
        OR (`Inventory` = '[[[],[]],[[],[]],[[],[]]]')
        OR (`Inventory` = '[[[],[]],[[],[]],[[],[]],0]')
)
AND `Damage` >= 0.1;


DELETE FROM `object_data` WHERE `Damage` > 0.8;
 

 

Share this post


Link to post
Share on other sites



  • 0

В обще что оно делает дословно:

Наносим урон раз в три дня в 10%, всем постройкам и техники с пустым инвентарем. Еще я так понимаю сюда надо в исключение добавить сейфы но пока не придумал как.

Share this post


Link to post
Share on other sites
  • 0

в общем вот что получилось, может кому пригодиться:

 

 

BEGIN


UPDATE `object_data`
SET `Damage` = 0.1
WHERE `LastUpdated` < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 DAY)
AND `Datestamp` < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 DAY)
AND (
        (`Inventory` IS NULL)
        OR (`Inventory` = '[]')
        OR (`Inventory` = '[[[],[]],[[],[]],[[],[]]]')
        OR (`Inventory` = '[[[],[]],[[],[]],[[],[]],0]')
)
AND `Classname` NOT IN ('VaultStorageLocked')
AND `Classname` NOT IN ('LockboxStorageLocked')
AND `Damage` < 0.1;


UPDATE `object_data`
SET `Damage`=`Damage`+0.1
WHERE `LastUpdated` < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 DAY)
AND `Datestamp` < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 DAY)
AND (
        (`Inventory` IS NULL)
        OR (`Inventory` = '[]')
        OR (`Inventory` = '[[[],[]],[[],[]],[[],[]]]')
        OR (`Inventory` = '[[[],[]],[[],[]],[[],[]],0]')
)
AND `Classname` NOT IN ('VaultStorageLocked')
AND `Classname` NOT IN ('LockboxStorageLocked')
AND `Damage` >= 0.1;


DELETE FROM `object_data` WHERE `Damage` > 0.8;


END
 

 



Наносим урон раз в три дня в 10%, всем объектам/постройкам/техники с пустым инвентарем, кроме сейфов и локбоксов, как только нанесенный дамаг превышает 80%,  объекты/постройки/техника удаляется, кроме сейфов и локбоксов. (так же если у вас стоит сторедж от Зупы, то этот запрос уже адаптирован под него)

 

далее к этому я сделаю отдельно ниже для сейфов процедуры, кому будет интересно то пишите, сюда же и выложу...

Edited by JustBullet (see edit history)

Share this post


Link to post
Share on other sites
  • 0

UPDATE `object_data` SET `Damage`=`Damage`+ 0.1;

Это уже ближе к правде но и тут "коса нашла на камень". `Damage` = 0.0 то функция не сработает

Это с чего?

с того, что какой то гуру внизу приписал -

 

AND `Damage` >= 0.1;

 

А удалить этот тупняк не судьба?

 

И почему это сейфам не надо наносить урон? - Наверное, боишься их удалить т.к. не ремонтируемы?

 

Ну так и сделай 3 триггера. Имхо будет "читабильней".

 

1. Удаляем объекты к которым не было доступа более ххх дней.

2. Наносим урон по всем объектам БД, без ссаных выборок, и исключений.

3. Снимаем урон (damage = 0) у объектов хранилищ.

 

Ты конечно можешь все исключения вписать в п.2. и обойтись без 3 триггера.

Edited by NoNameUltima (see edit history)

Share this post


Link to post
Share on other sites
  • 0

Это с чего?

с того, что какой то гуру внизу приписал -

 

AND `Damage` >= 0.1;

 

А удалить этот тупняк не судьба?

 

И почему это сейфам не надо наносить урон? - Наверное, боишься их удалить т.к. не ремонтируемы?

 

Ну так и сделай 3 триггера. Имхо будет "читабильней".

 

1. Удаляем объекты к которым не было доступа более ххх дней.

2. Наносим урон по всем объектам БД, без ссаных выборок, и исключений.

3. Снимаем урон (damage = 0) у объектов хранилищ.

 

Ты конечно можешь все исключения вписать в п.2. и обойтись без 3 триггера.

 

Да, не ремонтируемы, к тому же придумал уже много процедур да вообще решил все процедуры написать с нуля, так более понятно мне что на самом деле происходит, методов много и Ваш безусловно имеет место быть но вчера уже много что от той логике сделал ну и в принципе уже на финишной прямой... По поводу тупняка, это же просто проверка что бы не срабатывало обе процедуры. 

 

Может вы выложите свой pCleanup?

Share this post


Link to post
Share on other sites
  • 0

опять же про гуру, вы не из той оперы взяли мысль... это были слова для

  1. UPDATE `object_data` SET `Damage`=0.1 WHERE `ObjectUID` <> 0 AND `CharacterID` <> 0 AND `Datestamp` < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 DAY) AND ( (`Inventory` IS NULL) OR (`Inventory` = '[]') );

Share this post


Link to post
Share on other sites
  • 0

как обновить процедурой строку и вернуть LastUpdated в исходное значение до обновления?

Share this post


Link to post
Share on other sites
  • 0

1. Удаляем объекты к которым не было доступа более ххх дней.

2. Наносим урон по всем объектам БД, без ссаных выборок, и исключений.

3. Снимаем урон (damage = 0) у объектов хранилищ.

Я понял Вашу мысль но вот что я не пойму, как выполнить 1й пункт и дать ему понять что небыло доступа к объектам если после выполнения 2го пункта LastUpdated изменится и обновится...?

 

потому что как только я наношу урон объекту, БД автоматически обновляет его на новый LastUpdated, последний когда был нанесен урон и выходит что пункт 1 не будет работать.

 

я очень и очень не силен в запросах и пока мне хватает мозгов понимать и работать с примерами но дополнительных функций я не знаю... надеюсь вы понимаете о чем я.

 

со вторым и третьим пунктом я согласен, особенно понравилась фраза "Без ссаных выборок"  :smile:

Share this post


Link to post
Share on other sites
  • 0

1. Урон всему.

UPDATE `object_data` SET `Damage`=`Damage`+ 0.1;

2. Урон 0 для хранилищ.

UPDATE `object_data` SET `Damage`=0 WHERE 'Classname'=...AND 'Classname'=... - перечисляем список хранилищ. 

3. Удаляем все где урон больше 0.9, или последний доступ был более 30 дней назад.

 

DELETE 'object_data' WHERE `LastUpdated` > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 30 DAY) OR 'Damage' > 0.9;

 

Писал от руки...

1 , 3 пункт можно совместить добавив в 1 пункт выборку НЕ РАВНО

 

WHERE classname <> 'Сейф', AND classname <> 'Маленький сейф'
Edited by NoNameUltima (see edit history)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Maltaen46
      Ситуация такая,  сервер намальск (епоч 1051),  запускается сервер,  потом подключаюсь и сразу после загрузки задание висит загрузка на 0 и звук природы на заднем фоне. Но консоль пишет что мол подключился и бд не как не идёт.  Использовал hiveext.ini и с чистой сборки и со сборки Дмитрия покки.  После множества попыток узнать что не так,  я наткнулся что все идёт из папки mpmissions.  Кто сталкивался помогите.  Файлы миссии кину в ликчу кто решит помочь.  (связь вк vk.com/nox46) 
    • By FLOZzY
      Ребята, скажу сразу я нубяра в этом всем. Короче, был вайп серверной машины, после этого не загружается задание, считывает инфу с MySQL. как эту херню заставить работать?
    • By NickPS
      Доброго времени суток. Подскажите пожалуйста, как удалить объект на карте так, чтобы при дальнейших рестартах его там никогда не возникало.
      В моём случае, это Н-Барьер в арке в торговом посту Эммен на Напфе. Он мешает выезду техники.
      Админка от Инфистар.
    • By OXIDE
      Добрый день, делаю сервер для калькуляторов, нужна оптимизация. Уже выкл траву, убрал руды\хеликраши\спавн техники. За счёт чего ещё можно повысить FPS? Стоит WAI, DZAI нет.

      Сразу пишу сюда, дабы не засорять раздел. Можно ли как-то сделать строительство без анимации вообще, как в Rust?

      Как чистить базу данных от игроков, которые давно не заходили. Можно ли скрипт на удаление техники, если она долго стоит?
  • Our picks

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.