sql - MySQL 中如何遍历嵌套集合模型?

标签 sql mysql

我正在阅读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/

相关文章:

sql - 如何在 Oracle 中创建约束以避免重复值?

sql - 如何检查两个给定日期之间是否存在数据范围?

sql - 如何在 PostgreSQL 中移动整个组?

mysql - 如何在mysql中减去两个结果值

sql - 试图将表格的最近行连接到另一个表格

sql - 使用\copy 命令将 CSV 导入 Postgres 时如何转义\n(换行符)?

javascript - 单击搜索栏转到链接

MySQL获取尚未使用的优惠券

php - PHP 中正确 utf-8 编码的性能成本

MySQL ALTER TABLE 实际上并没有改变表