在SQL树结构中查找节点

时间:2013-02-01 23:04:59

标签: mysql sql hierarchical-data

我有一个存储在MYSQL数据库中的树状数据模型。通过在每个“节点”对象上使用两个字段来遍历树:

  • ID
  • parent_id

root id的parent_id为'null',树中的所有其他节点都引用了父id。

如果我想获得此树中所有节点ID的列表,我必须递归遍历树并收集每个节点的一个或多个属性,使用本质上是具有许多查询的for循环。

我想知道是否有办法在SQL中使用查询来更有效地执行此操作

2 个答案:

答案 0 :(得分:2)

我写了一篇关于我称之为Closure Table的解决方案的高评价帖子:What is the most efficient/elegant way to parse a flat table into a tree?

我还在演示文稿Models for Hierarchical Data with SQL and PHP和我的书SQL Antipatterns: Avoiding the Pitfalls of Database Programming中介绍了该设计。

我在Stack Overflow上多次回答有关分层数据查询的问题: https://stackoverflow.com/search?q=user%3A20860+%5Bhierarchical-data%5D

Quassnoi撰写了一系列关于在MySQL中查询树的博客文章: http://explainextended.com/2009/07/22/hierarchial-queries-in-mysql-identifying-trees/

Quassnoi还回答了有关分层数据的Stack Overflow的一些问题: https://stackoverflow.com/search?q=user%3A55159+%5Bhierarchical-data%5D

答案 1 :(得分:1)

您正在使用困难的模型进行搜索,即邻接列表模型。如果您知道您将拥有的父母与子女关系的潜在“级别”的数量,那么您可以构建一个查询来执行此操作。但是,如果它不是有限的数字,那么它将非常困难。

如果可能,请考虑使用嵌套集模型。这是一篇关于这个主题的好文章:

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

回到你的问题,你必须多次加入同一张桌子才能得到你想要的结果,如下所示:

SELECT *
FROM YourTable t
    LEFT JOIN YourTable t2 ON t2.parentid = t1.id
    LEFT JOIN YourTable t3 ON t3.parentid = t2.id
    LEFT JOIN YourTable t4 ON t4.parentid = t3.id

为每个潜在的子父母关系增加一个JOIN。

希望这会有所帮助,祝你好运。