我有一个表名为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
?这里的答案是1
,2
、3
和4
。
谢谢你的帮助。
3条答案
按热度按时间ymdaylpp1#
对于MySQL,我做到这一点的最简单方法是将所有路径存储在树中,创建一个transitive closure。
现在您可以这样查询:
另请参见:
wbgh16ku2#
由于MySQL不是设计用于递归查询的,所以我编写了存储过程来处理这个问题。请参阅我的DBA StackExchange帖子:Find highest level of a hierarchical field: with vs without CTEs
我编写了以下函数
GetParentIDByID
GetAncestry
GetFamilyTree
以上qjp7pelc3#
根据您当前的数据设置方式,有一种有效的方法来获取所有子代。您可以这样查询:
其中x、y和z是上一次迭代中检索到的所有子元素。重复查询,直到没有更多的行。这将需要与树的深度一样多的查询。
然而,如果你愿意改变你在数据库中存储树的方式,还有另一种叫做MPTT(Modified Pre-order tree Traversal)的方法,它可以让你用一个查询来获取整个子树,尽管更新更复杂。您需要弄清楚插入的额外复杂性是否为您的应用程序提供了一个很好的折衷,以获得高效检索的好处。
有一篇很好的文章解释了MPTT here。