【问题标题】:Find Nodes in SQL Tree Structure在 SQL 树结构中查找节点
【发布时间】:2013-01-17 08:55:30
【问题描述】:

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

  • 身份证
  • parent_id

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

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

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

【问题讨论】:

标签: mysql sql hierarchical-data


【解决方案1】:

我写了一篇关于我称之为 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

【讨论】:

    【解决方案2】:

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

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

    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。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多