库存系统/任务系统的正确计数

时间:2019-03-05 10:59:49

标签: mysql sql

道歉的随机标题。但基本上:

我允许用户继续执行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]

对复杂帖子的道歉。使清单系统实例成为基础还有其他原因(我当然可以简化它,但对于其他机制,我需要这种方式)。

1 个答案:

答案 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;