【问题标题】:SQL tree traversalSQL树遍历
【发布时间】:2010-09-26 23:53:32
【问题描述】:

我不完全确定我的命名是否正确,但请耐心等待。

我想知道是否可以在 SQL(特别是 MySQL)中做这样的事情: 假设我们在下表中的数据库中保存了类似树的数据:

  mysql> desc data_table;
  +------------------------+---------------------+------+-----+---------+----------------+
  | Field                  | Type                | Null | Key | Default | Extra          |
  +------------------------+---------------------+------+-----+---------+----------------+
  | id                     | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
  | parent_id              | int(10) unsigned    | YES  | MUL | NULL    |                |
  | value                  | text                | YES  |     | NULL    |                |

所以每一行都有一个父行,除了“根”行,每一行都有子行,除了叶行。

是否可以仅使用 SQL 找到任何给定行的所有后代?

【问题讨论】:

    标签: mysql sql data-structures tree hierarchical-data


    【解决方案1】:

    可以仅使用 SQL 获取所有后代,但不能在单个查询中。但我相信你已经明白了;我假设你的意思是你想在一个查询中完成。

    您可能有兴趣了解一些用于存储树结构的替代设计,这些设计确实使您能够使用单个 SQL 查询获取所有后代。请参阅我的演示文稿Models for Hierarchical Data with SQL and PHP

    您还可以对其他品牌的数据库(例如 PostgreSQL)使用递归 SQL 查询,但 MySQL 目前不支持此功能。

    【讨论】:

    • +1:不错的演示文稿,我将在接下来的一两个月内使用!
    【解决方案2】:

    您可能更喜欢使用嵌套集合模型(请参阅http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ - 进一步向下)。它对选择的效率要高得多,您可以通过简单的自连接获得每个节点的完整路径。 但是,在实践中,如果您想要执行诸如“ where depth = 3”之类的操作,或者如果您的表中有超过 1000 条记录,想要显示多个节点的完整路径,那么预先缓存路径和深度是一个好主意。

    【讨论】:

      【解决方案3】:

      我只是在问自己同样的问题。 这是我用谷歌搜索的: http://moinne.com/blog/ronald/mysql/manage-hierarchical-data-with-mysql-stored-procedures

      它适用于存储过程。

      但是在我看来,数据库中的这么多逻辑并不是一件好事..

      【讨论】:

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