SQL - 解决循环循环

时间:2014-07-16 00:55:35

标签: sql ms-access

我目前正在尝试创建一个数据库,用于跟踪mmorpg中的工艺材料,并且遇到了以下我正在努力解决的问题:

有成分,在食谱中用于创建新项目,但是,食谱创建的项目也可能是一种成分。

我目前有一个包含3个表的数据库:Items,Recipes和RecipeLink。

项目中的每条记录都有一个名称,用户获得的金额以及有关该项目的其他一些信息。

Recipe中的每个记录都有一个名称(当前也可能出现在Item中,如果它也用作项目),它创建的项目数量,一个布尔值(是/否字段,因为我正在使用MS Access )该项目是否已制作,以及该工艺技能要求的其他信息。

RecipeLink中的每条记录都会连接用于创建的配方所需的物品及其所需的数量。

e.g。

项目:

  • 项目: EarthShards; 获得: 586; 详细信息:在元素中挖掘或找到

  • 项目:日志; 获得: 12; 详细信息:从树上剪下

食谱:

  • 名称:木板; ** 数量: 3; 精制:真; 详细信息:需要木工级别7

RecipeLink:

  • 项目: EarthShards; 食谱:木板; 数量: 7

  • 项目:日志; 食谱:木板; 数量: 3

我目前使用的查询将返回:

  • 项目: EarthShards; 获得: 586; TotalRequired: 0;

  • 项目:日志; 获得: 12; TotalRequired: 0; (由于木板已经精心制作,因此不需要3个原木)

但是,当其他工艺品需要木板时会出现问题:

项目:

  • 项目: EarthShards; 获得: 586; 详细信息:在元素中挖掘或找到

  • 项目:日志; 获得: 12; 详细信息:从树上剪下

  • 项目:木板; 获得: 2; 详情:日志制作

食谱:

  • 名称:木板; 数量: 3; 精制:真; 详细信息:需要木工级别7

  • 名称: WoodenBowl; 数量: 1; 精制:真; 详细信息:需要木工级别11

  • 姓名: Bow; 数量: 1; 精制:错误; 详细信息:需要木工级别15

  • 姓名:替补; 数量: 1; 精制:错误; 详细信息:需要木工级别22

RecipeLink:

  • 项目: EarthShards; 食谱:木板; 数量: 7

  • 项目:日志; 食谱:木板; 数量: 3

  • 项目: EarthShards; 食谱: WoodenBowl; 数量: 6

  • 项目:木板; 食谱: WoodenBowl; 数量: 3

  • 项目: EarthShards; 食谱:弓; 数量: 16

  • 项目:木板; 食谱:弓; 数量: 5

  • 项目: EarthShards; 食谱:替补; 数量: 38

  • 项目:木板; 食谱:替补; 数量: 12

我当前的查询将返回:

  • 项目: EarthShards; 获得: 586; TotalRequired: 54;

  • 项目:日志; 获得: 12; TotalRequired: 0; (由于木板已经精心制作,因此不需要3个原木)

  • 项目:木板; 获得: 2; TotalRequired: 17; (由于木碗已经制作,因此不需要木碗3)。

但我希望它返回:

  • 项目: EarthShards; 获得: 586; TotalRequired: 89;

  • 项目:日志; 获得: 12; TotalRequired: 15; (每个木板需要3个,需要15个额外的木板)

  • 项目:木板; 获得: 2; TotalRequired: 17;

主要问题是,我认为可以通过在另一个食谱中使用的两个级别的食谱创建项来进行查询。然而,在游戏中有一些工艺品不仅仅有两个层次,即 日志 - >用于制作木板 - >用来制作强化的平板 - >用来制作一个强大的宝贝 - >用来做一个enchantedStrongBow - >用来做一个启示录鲍尔

未来的游戏更新有可能创造出比上述例子更长链的工艺品。

如何创建数据库(或查询,如果可以使用我当前的数据库)来管理它?

请告诉我是否/有什么额外信息可以解决我的问题。

1 个答案:

答案 0 :(得分:0)

我认为所有可以制作的东西都应该在Item表中表示。

<强>档案:

  • ItemId:1;名称:EarthShards
  • ItemId:2;名称:日志
  • ItemId:3;名称:木板
  • ItemId:4;名称:WoodenBowl

食谱项目应该存在食谱。每个食谱都应该引用它创建的项目。您可以选择不使用名称属性,因为您可以从OutputItemId获取名称。

<强>配方:

  • RecipeId 1;名称:木板; OutputItemId:3; OutputQuantity:3
  • RecipeId 2;名称:WoodenBowl; OutputItemId:4; OutputQuantity:1

RecipeLink将与您目前的方式保持不变。它将食谱与必要的物品及其数量联系起来。

<强> RecipeLink:

  • RecipeId:1; ItemId:1;数量:7
  • RecipeId:1; ItemId:2;数量:3
  • RecipeId:2; ItemId:1;数量:6
  • RecipeId:2; ItemId:3;数量:3

完成此设置后,您需要进行一些递归查询。您将从正在制作的配方直接需要的项目开始。对于每个项目,通过加入OutputItemId获取食谱,然后获取该食谱的项目,依此类推。

我了解您正在使用MS Access。看起来这种重复查询的最佳方法是在Access中编写一个函数。本文解释了该怎么做:http://support.microsoft.com/kb/132242/EN-US

我不确定您是否愿意为您的开发考虑其他数据库,如Sql Server Express或Sql LocalDb。两者都是免费的,会给你更多的查询马力。

我创建了一个SqlFiddle,向您展示如何使用单个查询在任何一个Sql产品中获得所需的结果。请在此处查看:http://sqlfiddle.com/#!6/18071/3