MySQL所有父子关系
我有一个名为MySQL所有父子关系,mysql,hierarchical-data,Mysql,Hierarchical Data,我有一个名为table的表。它有一个名为id的字段,类型为INT(11),表示行的标识符,它还有其他字段,但我认为它们与此问题无关 我有另一个名为table\u children的表。它有一个名为parent的字段,其类型为INT(11),将table.id作为外键引用。它还有另一个名为child的字段,其类型为INT(11),也将table.id作为外键引用。此表描述了表行到表行的父子关系 这是一个可能的背景 table table_children id parent chil
table
的表。它有一个名为id
的字段,类型为INT(11)
,表示行的标识符,它还有其他字段,但我认为它们与此问题无关
我有另一个名为table\u children
的表。它有一个名为parent
的字段,其类型为INT(11)
,将table.id
作为外键引用。它还有另一个名为child
的字段,其类型为INT(11)
,也将table.id
作为外键引用。此表描述了表
行到表
行的父子关系
这是一个可能的背景
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
谢谢您的帮助。因为MySQL不是设计用来处理递归查询的,所以我编写了存储过程来处理这个问题。请参阅我的DBA StackExchange帖子: 我编写了以下函数
GetParentIDByID
getEssency
GetFamilyTree
SELECT child FROM table_children WHERE parent in (x, y, z);
其中x、y和z是在上一次迭代中检索到的所有子对象。重复查询,直到没有更多行。这将需要与树的深度一样多的查询
但是,如果您愿意更改在DB中存储树的方式,那么还有另一种替代方法,称为MPTT(修改的预排序树遍历),它允许您通过单个查询获取整个子树,尽管更新比较复杂。您需要弄清楚,对于您的应用程序来说,插入的额外复杂性是否是一个很好的折衷方案,以获得高效检索的好处
有一篇很好的文章解释了MPTT。使用MySQL,最简单的方法是将所有路径存储在树中,创建一个目录 现在您可以这样查询它:
SELECT t.*
FROM table_children c
JOIN table t ON c.child = t.id
WHERE c.parent = 0;
另见:
SELECT t.*
FROM table_children c
JOIN table t ON c.child = t.id
WHERE c.parent = 0;