帮助编写嵌套集的SQL查询

帮助编写嵌套集的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

我使用嵌套集在数据库中存储一棵树。该表的字段是id、lft、rgt和name

给定一个节点ID,我需要找到它的所有直接子节点(不是孙子节点),这些子节点本身就是叶节点。

这篇文章给出了如何使用嵌套集的一个很好的示例,并给出了许多常见查询的示例,包括这一个

以下是如何查找节点的直接子节点:

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
    更好,至少改进不足以打破嵌套集设计的原则。