是否可以在单个查询中查询MySQL中的树结构表到任何深度?

Cam*_*oth 58 mysql sql database-design hierarchical-data data-structures

我认为答案是否定的,但是我很喜欢它,任何人都可以深入了解如何在SQL(MySQL)中将树结构爬行到任何深度,但只需一个查询

更具体地说,给定树结构表(id,data,data,parent_id)和表中的一行,是否可以获得所有后代(子/孙/等),或者就此而言所有祖先(父/祖父母)/etc)使用单个查询而不知道它将向下或向上移动多远?

或者正在使用某种递归需求,我不断深入查询,直到没有新的结果?

具体来说,我正在使用Ruby和Rails,但我猜这不是很相关.

Dav*_*ney 37

是的,这是可能的,它被称为修改的预订树遍历,如这里最好的描述

Joe Celko的树和SQL中的层次结构用于聪明人

这里提供了一个工作示例(在PHP中)

http://www.sitepoint.com/article/hierarchical-data-database/2/

  • (那太可怕了.) (3认同)

Aar*_*sen 23

这里有几个资源:

基本上,您需要在存储过程或查询中执行某种游标或构建邻接表.我会避免在db之外的递归:取决于你的树有多深,这可能会变得非常缓慢/粗略.


Dan*_*Dan -1

您几乎肯定会想要为此采用一些递归。如果您这样做,那么将整个树而不是其中的一部分达到固定深度将是微不足道的(实际上更容易)。

在非常粗糙的伪代码中,您将需要以下内容:

getChildren(parent){
    children = query(SELECT * FROM table WHERE parent_id = parent.id)
    return children
}

printTree(root){
    print root
    children = getChildren(root)
    for child in children {
        printTree(child)
    }
}
Run Code Online (Sandbox Code Playgroud)

尽管在实践中你很少想做这样的事情。它的效率相当低,因为它对表中的每一行都发出一个请求,因此它只对小表或嵌套不太深的树才有意义。老实说,无论哪种情况,您可能都想限制深度。

然而,考虑到这些类型的数据结构的流行,很可能有一些 MySQL 的东西可以帮助你解决这个问题,特别是减少你需要进行的查询数量。

编辑:考虑一下,提出所有这些查询没有什么意义。如果您无论如何都要读取整个表,那么您可以将整个表放入 RAM 中 - 假设它足够小!