7

如果我使用甲骨文有connect by可用于创建分层查询的关键字。目前我在一个项目中使用 MySQL,我想知道connect byMySQL 中是否有替代方案?

我尝试了谷歌,但到目前为止无济于事。我想要实现的是用一个查询从数据库中获取一棵树。涉及到两个表:

areasarea_to_parent_join。后者包含两个id,一个是area_id,另一个是parent_id。所以它基本上是一个自连接,我可以使用该模型创建图表。事实上,它目前仅用于创建树,但将来可能会改变。但无论哪种情况,我想要的只是一棵生成树。

编辑: areas可能有超过 1.000.000 条记录,这使得大多数空间密集型选项不可行。

4

2 回答 2

10

正如评论中所说,mysql没有捷径可走。

但!

如果您有可能更改数据库结构,则可以部署更好的设计来处理树状层次结构。

如果您遵循Bill Karwin 的THIS TUTORIAL这里是引用该幻灯片教程的原始答案),您可以找到 4 种用于建模层次结构的方法:

  1. Adiacency 列表
  2. 路径枚举
  3. 嵌套集
  4. 封闭表

现在,最好的模型可能是第 4 个(我将其他 3 个模型的描述留给读者),它基本上需要 2 个表:一个用于元素,一个用于路径。在路径表(闭包表本身)中,您将存储从每个节点到每个后代的每条路径(不仅仅是直接子节点!)。

建议还保存每一行的路径长度,因为这样更容易查询树中的直接子节点。

即使此解决方案需要更多空间,它也具有最佳的整体性能并且非常易于使用:它根本不依赖递归查询,并且它将授予整个数据集的引用完整性!

例如,要获取节点 #4 的每个子节点:

select a.*
from nodes a
join paths b
on a.node_id = b.descendant
where b.ancestor = 4

另一个例子:获取节点#11的所有祖先

select a.*
from nodes a
join paths b
on a.node_id = b.ancestor
where b.descendant = 11

需要删除节点#6的子树

delete from paths where descendant in
(select descendant from paths where ancestor = 6)
于 2013-10-02T08:26:12.033 回答
1

在我的应用程序中,我很少需要询问整个子树。因此,为了摆脱 o2 的大问题,我使用 3 深度关联/闭包表查找 - 用祖先填充表 - 仅针对子、父母和祖父母的后代。只要认识到你得到了你所输入的——即,不要在没有存储过程的情况下查询整个树。

于 2015-03-26T16:46:11.950 回答