Sql '的目的是什么;右';嵌套树中的值?

Sql '的目的是什么;右';嵌套树中的值?,sql,tree,nested,Sql,Tree,Nested,如果我要查找父节点的嵌套节点,我会像这样查询子节点: parent.left

如果我要查找父节点的嵌套节点,我会像这样查询子节点:

parent.left 但这始终是正确的:

child.right 那么,为什么我发现的所有示例都运行一个中间查询呢

谢谢,
Matt

我相信这只适用于二叉搜索树(BST),而不一定适用于所有二叉树。

如果你说的是,那么你就错了:
parent.left
child.right

因此,您可以通过查询左右ID之间的节点ID来获取节点的所有子节点

请参阅中Celko的第二个查询:


在嵌套集中,通过指定每个节点的左边界和右边界来描述层次结构,并且所有子节点都位于这些边界内。假设您的层次结构看起来像

A
 - B
 - C
    - D
    - E
 - F
 - G
H
I
 - J
将每一行添加到嵌套集中时,最终将得到一个如下所示的表:

+----+--------+-----+-----+-----------+
| id | value  | lft | rgt | parent_id |
+----+--------+-----+-----+-----------+
|  1 | A      |   1 |  14 |      NULL |
|  2 | B      |   2 |   3 |         1 |
|  3 | C      |   4 |   9 |         1 |
|  4 | D      |   5 |   6 |         3 |
|  5 | E      |   7 |   8 |         3 |
|  6 | F      |  10 |  11 |         1 |
|  7 | G      |  12 |  13 |         1 |
|  8 | H      |  15 |  16 |      NULL |
|  9 | I      |  17 |  20 |      NULL |
| 10 | J      |  18 |  19 |         9 |
+----+--------+-----+-----+-----------+
或者从另一个角度来看:

        -D- -E-
  -B- -----C----- --F-- --G--             --J--
---------------A---------------- --H-- -----I-----
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
当您想要查询一个节点的所有后代(比如
a
)时,您可以这样查询:

SELECT *
FROM table AS node
JOIN table AS parent
  ON parent.id = 1
WHERE node.lft BETWEEN parent.lft AND parent.rgt -- BETWEEN 1 AND 14
ORDER BY lft

由于每个节点的左边界必须小于其右边界,因此无需检查节点的右边界,只需搜索位于父边界内的节点(因此,右边界仅用于确定集合的终点位置)。例如,如果您试图获取节点
C
的后代,并且只根据
C
的左边界进行检查,那么查询将返回兄弟节点(
F
G
),并且不相关(
H
I
J
)到
C
,这并不清楚。子节点的查询不应该类似于child.parent=parent.id吗?或者您正在尝试查询某种排序平衡二叉树中的节点?如果是后者,该节点不应该按child.leftparent.right和child.left>parent.left进行分类吗?并不是说这会让你得到你期望的树,但至少它是有意义的。你在问什么?我见过它们被命名为嵌套集、嵌套树(mysql网站)、邻接列表。正确的术语是什么?邻接列表和嵌套集是不同的概念。邻接列表将记录链接到其父记录。嵌套集可以包含父ID列,但具有左列和右列,以确定哪些元素是子体。看,我说的是嵌套集,明白了。如果存在其他父对象,则Parent.left这肯定是嵌套集模型,而不是邻接列表模型。
SELECT *
FROM table AS node
JOIN table AS parent
  ON parent.id = 1
WHERE node.lft BETWEEN parent.lft AND parent.rgt -- BETWEEN 1 AND 14
ORDER BY lft