使用MySQL查询来遍历行来构buildrecursion树

我有一个物料清单表,这样设置:
项目 – 家长

显示物料清单时的最终结果就是显示如下:

item 1 - parent 0 item 2 - parent 1 item 3 - parent 1 

最终的结果也可能是这样的多层次:

 item 3 - parent 0 item 4 - parent 3 item 76 - parent 3 

它可以继续下去:

 item 76 - parent 0 item 46 - parent 76 item 46 - parent 0 item 25 - parent 46 

现在,我只是从数据库中获得1个级别:

SELECT * FROM bom WHERE parentId = $itemId (shorthand)

或者从表中拉出每一行,并使用我的recursion函数来整理我需要的,但是这显然是低效的,因为我可能只需要10行,但是我拉了10,000条logging。 recursion函数的输出将会像这样创build一棵树:

 item 1 item 2 item 3 item 4 item 76 item 46 item 25 

我所知道的是我从第一项开始。第五项可以有一个11的父母; 他们不必顺序。 我想要把树上的所有孩子分支都拿走 我怎么能在MySQL中做这个查询?

回到2011年10月24日,有人在DBA StackExchange上发布了一个关于MySQL中遍历树问题 。 MySQL的SQL不能支持它。

我在这个问题的答案中写了三(3)个存储过程( GetParentIDByID,GetAncestry和GetFamilyTree )。 希望这些信息可以帮助你构build你正在寻找的东西。

Bill Karwin发布了一个关于MySQL中的病态 数据的幻灯片。 如果更改数据库devise是一个选项,还有一些其他吸引人的方式来存储数据,以便查询。 他涵盖的方法是:

  • 邻接表
  • path枚举
  • 嵌套集
  • closures表

幻灯片69有一个很好的表格,显示每种方法的优缺点,所以我build议你先看看幻灯片,看看哪种方法可能适合你,然后回头看看如何实现它的细节。 请注意,您所select的devise(邻接表)是所提出的四个devise中仅有的一个,这使得难以查询子树。

话虽如此,如果你不能改变你的devise,或者你想坚持邻接表,那么我必须同意Didier的看法,你应该看看Quassnoi的文章“MySQL中的分层查询” 。 这是一个非常明确的文章,并解释如何高效地编写查询。

AFAIK,用MySQL来做这件事并不重要。

这里有一组关于它的文章:

http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/