我正在阅读this article 并在查询部分:
SELECT node.name
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND parent.name = 'ELECTRONICS'
ORDER BY node.lft;
我想知道它是如何遍历的?一步一步发生什么?我很困惑,请帮忙。
最佳答案
数据库系统可以通过多种不同的方式执行查询,但得到相同的结果,但这里有一种方法可以了解正在发生的情况:
获取nested_category表的2个副本,一个命名为父级,另一个命名为节点。在父级中查找名为 ELECTRONICS 的行(您链接到的文章暗示只有一篇)。范围parent.lft到parent.rgt给出了树中任何深度以ELECTRONICS作为祖先的任何节点。
按node.lft排序意味着您将首先在pre-order traversal中沿着子树的左侧获得ELECTRONICS的子节点。 .
通过一个更简单的示例来理解这一点可能会更容易:如果我们选择 TELEVISIONS 而不是 ELECTRONICS 作为父项会怎样:
“父”集只有 1 行,因为 [parent.name = 'TELEVISIONS']:
{ name: "TELEVISIONS", lft: 2, rgt: 9 }
“节点”集有 4 行满足 [node.lft 在 2 到 9 之间],因为我们可以替换父级中的单个 lft/rgt 值:
{ name: "TELEVISIONS", lft: 2, rgt: 9 }
{ name: "TUBE", lft: 3, rgt: 4 }
{ name: "LCD", lft: 5, rgt: 6 }
{ name: "PLASMA", lft: 7, rgt: 8 }
而且,正如您所看到的,上面 4 行已经按“lft”值排序,因此为了满足查询,我们只需获取名称值即可。
关于sql - MySQL 中如何遍历嵌套集合模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1425621/