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

深度嵌套的子查询,用于遍历MySQL中的树

阴培
2023-03-14
问题内容

我的数据库中有一个表,其中使用混合嵌套集(MPTT)模型(具有lft和的rght值)和邻接列表模型(存储parent_id在每个节点上)存储树结构。

my_table (id, parent_id, lft, rght, alias)

这个问题与树的任何MPTT方面都不相关,但是我想我将其保留,以防万一有人对如何利用它有个好主意。

我想将别名的路径转换为特定的节点。例如:"users.admins.nickf"将找到别名为“ nickf”的节点,该节点是别名为“
admins”的节点的子节点,别名为“ users”的根节点。上有一个唯一索引(parent_id, alias)

我首先编写函数,以便将路径拆分为各个部分,然后一个一查询数据库:

SELECT `id` FROM `my_table` WHERE `parent_id` IS NULL AND `alias` = 'users';-- 1
SELECT `id` FROM `my_table` WHERE `parent_id` = 1 AND `alias` = 'admins';   -- 8
SELECT `id` FROM `my_table` WHERE `parent_id` = 8 AND `alias` = 'nickf';    -- 37

但是后来我意识到,使用可变数量的嵌套,我可以通过一个查询来做到这一点:

SELECT `id` FROM `my_table` WHERE `parent_id` = (
    SELECT `id` FROM `my_table` WHERE `parent_id` = (
        SELECT `id` FROM `my_table`
        WHERE `parent_id` IS NULL AND `alias` = 'users'
    ) AND `alias`  = 'admins'
) AND `alias` = 'nickf';

由于子查询的数量取决于路径中的步骤数,因此我是否会遇到 子查询过多的 问题?(如果有这样的事情)

有没有更好/更智能的方法来执行此查询?


问题答案:

这行得通吗?

select r0.id 
  from my_table as r0 
  join my_table as r1 on(r0.parent_id = r1.id) 
  join my_table as r2 on(r1.parent_id = r2.id)
 where r0.alias='nickf'
   and r1.alias='admins'
   and r2.alias='users'
   and r2.parent_id is null

在我看来,实际上并不需要嵌套的子查询。

还是我错了,错过了什么?



 类似资料:
  • def deep(root): if not root: return print root.data deep(root.left) deep(root.right) if __name__ == '__main__': lookup(tree) deep(tree)

  • 我试图解剖一个深度嵌套的对象。遍历它并将数据拉到一个单个级别的对象,然后再与一个更大的对象结合在一起。我可以用下面的代码遍历它,但它不是动态的。这只有在我知道它的4个物体深度的情况下才起作用。实际上它可以是1->n深。我还有一个函数,它在该级别检查值的类型,并对其进行相应的处理。现在这对我很管用 这里是顶层 下面是每一个级别: 希望这是足够的上下文来了解我当前在做什么。现在,我有数据可以通过一个数

  • 问题内容: 我试图遍历嵌套对象以检索由字符串标识的特定对象。在下面的示例对象中,标识符字符串是“ label”属性。我无法解决如何遍历树以返回适当对象的问题。任何帮助或建议,将不胜感激。 问题答案: 您可以创建像这样的递归函数来对对象进行深度优先遍历。 可以这样称呼

  • 给定一个数组,构建二叉树,并且按层次打印这个二叉树

  • 本文向大家介绍Python实现深度遍历和广度遍历的方法,包括了Python实现深度遍历和广度遍历的方法的使用技巧和注意事项,需要的朋友参考一下 深度遍历: 原则:从上到下,从左到右 逻辑(本质用递归): 1)、找根节点 2)、找根节点的左边 3)、找根节点的右边 广度遍历: 核心:队列+递归 以上这篇Python实现深度遍历和广度遍历的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希

  • 问题内容: 假设我有一个像这样的JSON数组: 不,我想基于id查找某个对象,一旦有了该对象,就需要它的子代及其所有childs子代 所以可以说如果 4d024610-a39b-49ce-8581-a18500739a75* 我想找到一个具有ID的元素 * 那应该找到Element Sub2 现在,它应该产生所有将产生的所有子元素id id: 假设我会做 因此,我猜它有两个部分,首先找到“父”元素