当有多棵树时,使用修改后的前序树遍历进行选择
Selecting with modified preorder tree traversal when there are multiple trees
出于优化原因,我已经实施了修改后的预序树遍历 as explained here。我的 table 是这样的:
+----+-----------+------+-------+
| id | parent_id | left | right |
+----+-----------+------+-------+
| 1 | NULL | 1 | 4 |
| 2 | 1 | 2 | 3 |
| 3 | NULL | 1 | 4 |
| 4 | 3 | 2 | 3 |
+----+-----------+------+-------+
即table 中存在任意数量的树。如果一个节点的父 ID 为 null,那么这自动意味着该节点是其树的基础。
文章指出可以非常简单地select所有节点的后代:
SELECT *
FROM table
WHERE
left > ?
AND
right < ?
现在我的问题是 selection 显然要包含其他树的节点。毕竟,我什至没有指定一棵树开始。是否可以使用此模型仅 select 来自一棵指定树的节点?[=13=]
不要以 left
= 1 开始新树。使用 MAX(right
) + 1 作为 left
值。这不会影响其他节点操作,树将被左右范围分隔。
出于优化原因,我已经实施了修改后的预序树遍历 as explained here。我的 table 是这样的:
+----+-----------+------+-------+
| id | parent_id | left | right |
+----+-----------+------+-------+
| 1 | NULL | 1 | 4 |
| 2 | 1 | 2 | 3 |
| 3 | NULL | 1 | 4 |
| 4 | 3 | 2 | 3 |
+----+-----------+------+-------+
即table 中存在任意数量的树。如果一个节点的父 ID 为 null,那么这自动意味着该节点是其树的基础。
文章指出可以非常简单地select所有节点的后代:
SELECT *
FROM table
WHERE
left > ?
AND
right < ?
现在我的问题是 selection 显然要包含其他树的节点。毕竟,我什至没有指定一棵树开始。是否可以使用此模型仅 select 来自一棵指定树的节点?[=13=]
不要以 left
= 1 开始新树。使用 MAX(right
) + 1 作为 left
值。这不会影响其他节点操作,树将被左右范围分隔。