我正在尝试将一个带有Web界面的mysql数据库放在一起。这需要显示项目的完整组成。例如:项目 A 由5个成分 B ,10个成分 C 和一个成分 D 组成。组分 B 由一个子组分 e ,一个子组分 f 和10个子组分 g 。组分 C 由两个子组分组成: h 和 i 各一个。组件 D 没有子组件。当我为Item A 输入数量(在html / php表单上)时。我想完整地分解组件和子组件。在这个例子中,我需要10 b 。我的输出应该是这样的:
B - 50包括:
D - 10
有人能指出我正确的方向开始选择这个吗?
答案 0 :(得分:1)
我会创建一个描述材料名称的材料表等。然后,我会有一个连接表,其中包含父材质ID的列和子材质ID的列以及所需的子材质量。
示例:材料A将具有id 1,材料B id 2,材料C id 3和材料D id 4.如果材料A需要1份材料B和3份材料C,则它将具有连接中的条目表说[1(A的id),2(b的id),1(部分的数量)]和[1,3,3]。现在,让我们说如果材料B有3个部分C和4个部分D它将具有条目[2(B的id),3(c的id),3(parsts)]和[2,4(d's id),4 (部分)。拉出来你会从根(A)开始,向连接表询问父id = A的id的所有条目,然后对每个子材料id做同样的事情(询问表格中的所有条目将子id作为父材料)等等。除非你指定了某种最大深度,否则它必须是一个递归函数
潜在的问题是,如果你让材料A依赖于B,而B依赖于A,那么你将获得无限递归。您将不得不进行一些严重的错误检查,以确保没有任何子进程引用其树上的任何内容,因此它不会循环。创建此错误检查可能是此实现中最难的部分。
你的select语句不能一个一个地执行,因为SQL(据我所知)并不真正支持递归,所以你可能想要创建一个参数化查询,比如“SELECT * FROM TheJoinTable WHERE parentId =?”并且只是一遍又一遍地运行它,直到你到达返回行数为0的结尾。你还需要在嵌套数组上构建这个函数,然后你可以很容易地将它变成你页面的输出。 / p>
对于参数化查询,请查看php的PDO库。参数化查询也将解决许多sql注入问题,在我看来应该是一般的做法。
我希望这不是太混乱......你的问题基本上要求实施,我发现很难保持简短的实施描述,当我试图保持简短时,我有时会忘记提及一些事情。< / p>