道歉的随机标题。但基本上:
我允许用户继续执行user_quests
中存储的任务。任务可能会要求用户获取多个项目并将它们存储在user_quest_items
中。
结构:
user_quests [ID,用户ID,时间戳记]
user_quest_items [ID,userquestid,itemid,amount_needed]
现在,我正在尝试运行一个查询,以查找用户库存中是否有所需的物品数量,因此可以将其显示给用户。即
找到青苹果[2/4]
我的库存系统允许同一物料的不同实例。结构:
物品[ID,物品名称,描述,稀有度]
item_instance [ID,itemid,special_details]
库存[ID,用户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]
对复杂帖子的道歉。使清单系统实例成为基础还有其他原因(我当然可以简化它,但对于其他机制,我需要这种方式)。
答案 0 :(得分:0)
我不确定您如何包含不存在的项。但是,即使没有项目,也可以包括用户ID。您可以通过为该用户启动left join
链来实现:
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;