MySQL所有父子关系

vjrehmav  于 2022-10-22  发布在  Mysql
关注(0)|答案(3)|浏览(245)

我有一个表名为table。它有一个名为mn1o1p的字段,类型为m12o1p,表示该行的标识符。它有其他字段,但我认为它们与此问题无关。
我有另一个名为table_children的表。它有一个名parent、类型为m1n 5o1p且引用table.id作为外键的字段。它有另一个名为child的字段,类型为m1n 8o1p,该字段也将table.id作为外键引用。此表描述了table行到table列的父子关系。
这是一个可能的设置。

table   table_children
id      parent child
0       0      1
1       1      2
2       1      3
3       3      4
4

如何在最少的请求数中获得0的所有后代的id?这里的答案是1234
谢谢你的帮助。

ymdaylpp

ymdaylpp1#

对于MySQL,我做到这一点的最简单方法是将所有路径存储在树中,创建一个transitive closure

table_children
parent child
0      0
1      1
2      2
3      3
4      4
0      1
0      2
0      3
0      4
1      2
1      3
1      4
3      4

现在您可以这样查询:

SELECT t.*
FROM table_children c
JOIN table t ON c.child = t.id
WHERE c.parent = 0;

另请参见:

wbgh16ku

wbgh16ku2#

由于MySQL不是设计用于递归查询的,所以我编写了存储过程来处理这个问题。请参阅我的DBA StackExchange帖子:Find highest level of a hierarchical field: with vs without CTEs
我编写了以下函数

  • GetParentIDByID
  • GetAncestry
  • GetFamilyTree以上
qjp7pelc

qjp7pelc3#

根据您当前的数据设置方式,有一种有效的方法来获取所有子代。您可以这样查询:

SELECT child FROM table_children WHERE parent in (x, y, z);

其中x、y和z是上一次迭代中检索到的所有子元素。重复查询,直到没有更多的行。这将需要与树的深度一样多的查询。
然而,如果你愿意改变你在数据库中存储树的方式,还有另一种叫做MPTT(Modified Pre-order tree Traversal)的方法,它可以让你用一个查询来获取整个子树,尽管更新更复杂。您需要弄清楚插入的额外复杂性是否为您的应用程序提供了一个很好的折衷,以获得高效检索的好处。
有一篇很好的文章解释了MPTT here

相关问题