Извинения за случайный заголовок.Но в основном:
Я разрешаю пользователям проходить квесты, хранящиеся в 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]
Извиняюсь за сложный пост.Существуют и другие причины для создания экземпляра системы инвентаризации (я определенно мог бы сделать это проще, но мне это нужно для других механиков).