1

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

  • ID
  • parent_id

根 id 的 parent_id 为“null”,树中的所有其他节点都引用父 id。

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

我想知道是否有一种方法可以通过 SQL 中的查询更有效地做到这一点

4

2 回答 2

2

我写了一篇关于我称之为 Closure Table 的解决方案的高评价文章:将平面表解析为树的最有效/优雅的方法是什么?

我还在我的演示文稿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

于 2013-02-01T23:13:03.357 回答
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。

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

于 2013-02-01T23:14:41.623 回答