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