• Страница 1 из 1
  • 1
Архив - только для чтения
Модератор форума: andycrowz  
Sql запрос по очистке данных
infinium
Маршал
Нужно удалить определённые предметы в определённом количестве у определённых игроков(тавтология прям), на всё про всё есть itemEntry и гуиды персонажей.
Примерно выглядит это так:
Удалить у персонажа с гуидом=111 2предмета с entry = 333.
Нужно учесть то, что удалить нужно не все предметы с указанным номером, а лишь необходимое количество.

Сообразил пока вот только так:

Код
SELECT *
FROM character_inventory
WHERE guid = 2685 and item in (
  SELECT guid
  FROM item_instance
  WHERE itemEntry = '51947'
);


Результат:


Т.е. у персонажа 2685 есть 2 итема 51947.
Как преобразовать/написать запрос на удаление необходимого количества предметов у персонажа?
Сообщение # 1 написано 26.08.2014 в 13:24
Evrial
Маршал
там, если предмет в стаке - то будет дрнугой запрос ибо в item_instance стак одной строкой. но если предмет обычный - то вроде запрос верный.

Ну вот я посмотрел вики по таблице http://wiki.ytdb.ru/index.php/Item_instance. Там в столбике text есть вообще все нужные данные (и ИД, и кол-во и ид_чара). Я когда-то работал с этим столбиком. Геморно, но возможно.

Если это не для сайта, то не проще ли реализовать это по принципу команды .add (с атрицательным аргументом)? В общем хотелось бы узнать зачем это нужно, чтоб поискать альтернативные варианты.
Сообщение # 2 написано 26.08.2014 в 16:26
infinium
Маршал
Была прописана куча шмота(отсеял лог, вышло 906 строк типа .add 43370 Holysword (GUID: 1229388)]), нужно изъять. Заходить на каждый аккаунт это затянется на месяц.
Поэтому выдумываю что-то более разумное.
Предметы в основном не стакающиеся.
Цитата Evrial ()
вроде запрос верный

да, но тут остался один нюанс, вот у персонажа 1229388 есть пять итемов 43370, 2 из них прописные, 3 было изначально у него, как это указать в запросе и возможно ли это вообще?
база кстати tdb, в принципе это не играет роли, но поле text пустует

по sql погуглил, ничего похожего на удаление n-значений из n+1-одинаковых значений не нашел, либо это настолько банально, либо...
Сообщение # 3 отредактировано infinium - Вторник, 26.08.2014, 17:13
ThisBetter
Скаут
infinium,
http://www.site-do.ru/db/sql18.php
Сообщение # 4 отредактировано ThisBetter - Вторник, 26.08.2014, 17:13
infinium
Маршал
ThisBetter, просмотрел, но для своего случая ничего не нашел, возможно из-за неопытности...
Сообщение # 5 написано 26.08.2014 в 22:50
Evrial
Маршал
Цитата infinium ()
отсеял лог, вышло 906 строк типа .add 43370 Holysword (GUID: 1229388)

ну вспоминая тяжкие будни админства... я бы делал надёжно и руками.

delete from item_intance where guid in (и тут через запятую 906 значений копипастом...)
или через guid between 1 and 10 - ну если там попорядку получилось много.

это только выглядит страшно. нарисовать 30 сэтов (а это 250-300) итемов тоже когда-то выглядело страшно. Ты затратишь на копипасту ну 2 часа. и вопрос решён.

А теперь главный вопрос. Мы удаляем из item_instance а character_inventory не трогаем. Вот почему:
1. если удалить только из инстанс - то итем всё равно пропадёт. правда в лог напишет мол там нет записи поэтому и эту удалю (ну из инвентаря)
2. можно просто сделать рестарт после заливки и при загрузке само почистит табличку инвентаря
3. для самых дотошных - delete from character_inventory where item not in (select guid from item_instance); - удалит все строки в character_inventory для которых нет записи в item_instance
Сообщение # 6 написано 27.08.2014 в 00:59
Sellysalie
infinium, допиши LIMIT 2 и будет тебе счастье.
Сообщение # 7 написано 27.08.2014 в 01:54
infinium
Маршал
Цитата Evrial ()
delete from item_intance where guid in (и тут через запятую 906 значений копипастом...)

Если бы были известны эти самые гуиды непосредственно таблицы item_intance, то я бы и не поднимал этот холивар
Цитата Evrial ()
А теперь главный вопрос. Мы удаляем из item_instance а character_inventory не трогаем. Вот почему:
1. если удалить только из инстанс - то итем всё равно пропадёт. правда в лог напишет мол там нет записи поэтому и эту удалю (ну из инвентаря)
2. можно просто сделать рестарт после заливки и при загрузке само почистит табличку инвентаря
3. для самых дотошных - delete from character_inventory where item not in (select guid from item_instance); - удалит все строки в character_inventory для которых нет записи в item_instance

Это логично.

AdmiralBZ, вот где собака зарыта ok
Код
DELETE *
FROM character_inventory
WHERE guid = 2685 and item in (
    SELECT guid
    FROM item_instance
    WHERE itemEntry = '51947'
) LIMIT 1;

Да этим я потру необходимое число не стакающихся итемов непосредственно у игрока, а item_instance можно почистить
Код
delete from item_instance where guid not in (select item from character_inventory);

Вроде бы вопрос решен.
Всем добра.
Сообщение # 8 отредактировано infinium - Среда, 27.08.2014, 18:09
Evrial
Маршал
Цитата infinium ()
Если бы были известны эти самые гуиды непосредственно таблицы item_intance, то я бы и не поднимал этот холивар

ответ цитатой:
Цитата infinium ()
.add 43370 Holysword (GUID: 1229388)

GUID: 1229388 - я полагаю это и есть гуид из item_intance.
Сообщение # 9 написано 27.08.2014 в 20:44
infinium
Маршал
Цитата Evrial ()
GUID: 1229388

Это гуид персонажа, сколько помню тс, никогда не писался гуид вещи при команде add
Да и я же уточнил в самом начале
Цитата infinium ()
на всё про всё есть itemEntry и гуиды персонажей


Цитата infinium ()
Да этим я потру необходимое число не стакающихся итемов непосредственно у игрока, а item_instance можно почистить
Код
delete from item_instance where guid not in (select item from character_inventory);

Сюда еще дописать проверочку на наличие вещи в ГБ:
Код
AND guid IN (SELECT item_guid FROM guild_bank_item);
Сообщение # 10 написано 27.08.2014 в 20:57
  • Страница 1 из 1
  • 1
Поиск: