Правильный счет для инвентарной системы / системы квестов - PullRequest
0 голосов
/ 05 марта 2019

Извинения за случайный заголовок.Но в основном:

Я разрешаю пользователям проходить квесты, хранящиеся в user_quests.Квест может попросить пользователя получить несколько предметов, и они хранятся в user_quest_items.

Структура:

user_quests [ID, идентификатор пользователя, метка времени]

user_quest_items [ID, userquestid, itemid, amount_needed]

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

Найти зеленое яблоко [2/4]

Моя система инвентаризации допускает разные экземпляры одного и того же предмета.Структура:

предметов [ID, наименование товара, описание, редкость]

item_instance [ID, itemid, special_details]

инвентарь [ID, идентификатор пользователя, item_instanceid, количество]

Таким образом, мой запрос должен вычислить, находятся ли предметы, которые запрашивает квест, в инвентаре пользователя.Мой текущий запрос:

SELECT items.itemname, inventory.quantity, item_instances.ID as instanceid,
item_instances.itemid as instance_itemid, user_quest_items.itemid FROM 
user_quest_items
INNER JOIN items ON items.ID = user_quest_items.itemid
INNER JOIN user_quests ON user_quests.ID = user_quest_items.userquestid
LEFT OUTER JOIN inventory ON inventory.userid = user_quests.userid
LEFT OUTER JOIN item_instances ON item_instances.ID = inventory.item_instanceid AND item_instances.itemid = user_quest_items.itemid
WHERE user_quest_items.userquestid = 27

К сожалению, это не работает.Я предполагаю, что это связано с левым внешним объединением инвентаря, но в основном он получает все элементы в инвентаре пользователя, а не определенные элементы, заданные user_quest_items.

Это работает, если я изменю item_instances на INNER JOIN, нопроблема заключается в том, что если у пользователя 0 из обязательных элементов, строки не возвращаются, что заставит пользователя думать, что его не просят об элементах.В этом случае мне нужно сказать:

Зеленое яблоко [0/4]

Извиняюсь за сложный пост.Существуют и другие причины для создания экземпляра системы инвентаризации (я определенно мог бы сделать это проще, но мне это нужно для других механиков).

1 Ответ

0 голосов
/ 05 марта 2019

Я не уверен, как вы можете включить предметов , которые не существуют. Вы можете, однако, включить идентификатор пользователя, даже если нет элементов. Это можно сделать, запустив для этого пользователя цепочку left join s:

SELECT u.userquestid,
       i.itemname, iv.quantity, ii.ID as instanceid,
       ii.itemid as instance_itemid, uqi.itemid
FROM (SELECT 27 as userquestid) u LEFT JOIN
     user_quest_items uqi
     ON u.userquestid = u.userquestid LEFT JOIN
     items i
     ON i.ID = uqi.itemid LEFT JOIN
     user_quests uq
     ON uq.ID = uqi.userquestid LEFT JOIN
     inventory iv
     ON iv.userid = uq.userid LEFT JOIN
     item_instances ii
     ON ii.ID = iv.item_instanceid AND
       ii.itemid = uqi.itemid;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...