树结构mysql查询

时间:2014-07-18 09:10:04

标签: mysql

我得到了这个表结构:

    -----------------------------------
     Name        DocID       ParentID
    -----------------------------------
     doc1          1           NULL
     doc2          2            1          
     doc3          3           NULL
     doc4          4            3
     doc5          5            1

查询应该输出父节点和子节点的树结构,该级别可以具有任何值。 输出就是这样:

    doc1
    |  --doc2
    |  --doc5
    | 
    doc3
       --doc4

你能帮助在mysql中通过简单或递归查询在mysql中做到这一点吗?

1 个答案:

答案 0 :(得分:0)

为您的数据模型(称为邻接列表)编写类似的查询将相对复杂且效率低下。如果您确实需要这样做,请查看http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html#adjacency_list_model

如果您不介意更改数据模型,有两种方法:

  1. 嵌套集 - http://en.wikipedia.org/wiki/Nested_set_model。这是最常见且易于使用的。有许多脚本和框架可以方便地使用嵌套集,而无需管理所有低级操作。如果您有现有数据,则可以循环遍历现有行并将它们插入到新的嵌套集表中,您将会很高兴。
  2. 或者,您可以将每个文档的完整分层路径(如面包屑)存储在新列中。类似的东西:

    ------
    Path
    ------
    doc1
    doc1>doc2
    doc1>doc5
    doc3
    doc3>doc4
    
  3. 第二种方法允许您在“Path”上使用ORDER BY进行简单的SELECT。然后你可以查看“>”的数量(或者您使用的任何字符)来确定文档在层次结构中的级别(在UI中缩进多少)。

    第二种方法并不理想,因为它需要更多维护。如果更改了一个父子关系,则最终必须重新生成所有路径。嵌套集也涉及相当多的行更新,但它的效率非常高。