Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL所有父子关系_Mysql_Hierarchical Data - Fatal编程技术网

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;