Cam*_*oth 58 mysql sql database-design hierarchical-data data-structures
我认为答案是否定的,但是我很喜欢它,任何人都可以深入了解如何在SQL(MySQL)中将树结构爬行到任何深度,但只需一个查询
更具体地说,给定树结构表(id,data,data,parent_id)和表中的一行,是否可以获得所有后代(子/孙/等),或者就此而言所有祖先(父/祖父母)/etc)使用单个查询而不知道它将向下或向上移动多远?
或者正在使用某种递归需求,我不断深入查询,直到没有新的结果?
具体来说,我正在使用Ruby和Rails,但我猜这不是很相关.
Dav*_*ney 37
是的,这是可能的,它被称为修改的预订树遍历,如这里最好的描述
这里提供了一个工作示例(在PHP中)
http://www.sitepoint.com/article/hierarchical-data-database/2/
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 中 - 假设它足够小!