我正在阅读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的子节点。

通过一个更简单的示例来理解这一点可能会更容易:如果我们选择电视而不是电子作为父级,该怎么办:

由于[parent.name ='TELEVISIONS'],“父”集只有1行:

{ 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”值排序,因此为了满足查询条件,我们只取名称值即可。

08-28 08:50