Sql '的目的是什么;右';嵌套树中的值?
如果我要查找父节点的嵌套节点,我会像这样查询子节点: parent.leftSql '的目的是什么;右';嵌套树中的值?,sql,tree,nested,Sql,Tree,Nested,如果我要查找父节点的嵌套节点,我会像这样查询子节点: parent.left
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.leftSELECT *
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