帮助编写嵌套集的SQL查询
我使用嵌套集在数据库中存储一棵树。该表的字段是id、lft、rgt和name 给定一个节点ID,我需要找到它的所有直接子节点(不是孙子节点),这些子节点本身就是叶节点。这篇文章给出了如何使用嵌套集的一个很好的示例,并给出了许多常见查询的示例,包括这一个 以下是如何查找节点的直接子节点:帮助编写嵌套集的SQL查询,sql,nested-sets,Sql,Nested Sets,我使用嵌套集在数据库中存储一棵树。该表的字段是id、lft、rgt和name 给定一个节点ID,我需要找到它的所有直接子节点(不是孙子节点),这些子节点本身就是叶节点。这篇文章给出了如何使用嵌套集的一个很好的示例,并给出了许多常见查询的示例,包括这一个 以下是如何查找节点的直接子节点: SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth FROM nested_category AS node, n
SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth
FROM nested_category AS node,
nested_category AS parent,
nested_category AS sub_parent,
(
SELECT node.name, (COUNT(parent.name) - 1) AS depth
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.name = '**[[MY NODE]]**'
GROUP BY node.name
ORDER BY node.lft
)AS sub_tree
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
AND sub_parent.name = sub_tree.name
GROUP BY node.name
HAVING depth = 1
ORDER BY node.lft;
然后将其与叶节点的
rgt
等于lft+1
这一事实结合起来,就可以设置了。请原谅这个双关语。要指定和区分叶节点,请将它们保留为left=right。这改变了两件事:
我们在数据库中使用嵌套集进行了大量开发。父节点的左值和右值将始终为其子节点设置值的边界 要使用lft和rgt值查找任何节点的子节点,请执行以下操作:
select
child.id,
child.lft,
child.rgt
from
nodes child,
nodes parent
where
child.lft between parent.lft and parent.rgt
and parent.id != child.id
and parent.id = [ID];
我们在这里所做的是为同一个表的子节点和父节点创建一个别名,然后找到适合给定父节点的子节点。
parent.id!=child.id
删除了输出中的冗余条目。回送机器已完成。@如果文章现在在作者的网站上,我更正了答案中的链接。这要求(或者假设)所有节点都有唯一的名称,这也是一篇很好的嵌套集文章:这不符合op的要求:我需要找到它的所有直接子代(而不是孙辈)。我不知道left=right
如何比left=right-1
更好,至少改进不足以打破嵌套集设计的原则。