当前位置: 首页 > 面试题库 >

MySQL中是否有“ connect by”替代方案?

黄沈浪
2023-03-14
问题内容

如果我使用Oracle,则有connect by一个可用于创建层次查询的关键字。当前,我在一个项目上使用MySQL,我想知道connect byMySQL中是否有替代方法?

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

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

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


问题答案:

正如评论中所说,使用mysql没有捷径。

但!

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

如果您遵循Bill Karwin的《 本教程 》( 此处
是引用幻灯片演示教程的原始答案),则可以找到用于建模层次结构的4种方法:

  1. Adiacency List
  2. Path Enumeration
  3. Nested sets
  4. Closure table

现在,最好的模型是第四个模型(我将其他三个模型的描述留给读者),它基本上需要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)


 类似资料:
  • 根据文件中的说明: setState()不会立即改变this.state,但会创建挂起的状态转换。调用此方法后访问this.state可能会返回现有值。 对setState的调用不能保证同步操作,可能会为了提高性能而对调用进行批处理。 因此,由于是异步的,因此无法保证其同步性能。是否有同步的替代方法。 例如 因为值是以前的值,所以什么是替代方案,将给予使用。 Stackoverflow上有几个问题

  • 问题内容: py2exe是否有替代品? 问题答案: cx_Freeze是跨平台的,并且具有相同的功能,或者您可以使用py2app,它仅在Mac上有效。

  • 问题内容: 是否有ANSI SQL替代MYSQL LIMIT关键字? LIMIT关键字限制SELECT返回的行数,例如: 返回2行。 在前10个之后返回2行。 问题答案: 这显示了不同的方式:

  • 我知道苹果发布了基于蓝牙4.0协议的iBeacon。 在任何蓝牙设备中,如果我们使用以下代码对设备进行编码: 表示呈现此蓝牙设备是iBeacon蓝牙设备。 我的问题是,如果我定义了自己的协议,这意味着我会改变它 是否有一种可能性,我可以通过iphone识别我自己定义的蓝牙设备,而无需在iphone上添加识别设备。 苹果是否支持定制ibeacon? 编辑根据davidgyoung所说,我对stack

  • 我正在处理一个电影数据集,该数据集有电影、genre和桥接表in_Genre的表。下面的查询试图查找两部电影之间的共同类型。我做了两个连接来获得流派列表,并做了一个交叉来找到常见的流派。有没有更有效率的办法? null

  • 问题内容: 我试图通过FOP渲染大约100,000-80列记录,并且每次都几乎耗尽(OutOfMemoryException)。我知道iText可以处理这种负载,但是由于LGPL许可证,我无法使用它。iText是否有其他Java库可以处理将大量数据呈现为PDF的问题? 问题答案: 有商业PDF生成库,例如BFO和ElegantJ。如果您需要开源,则有PDFBox,但我不知道它是否已准备好投入生产。