【问题标题】:How to locate a specific child of a specific level2 node in a nested set如何在嵌套集中定位特定 level2 节点的特定子节点
【发布时间】:2014-11-19 01:06:29
【问题描述】:

我有一个标准的嵌套集模型,每个节点都有名称、lft 和 rgt 属性。

我可以使用以下方法找到特定员工的上级:

SELECT P2.* FROM Personnel AS P1, Personnel AS P2
WHERE P1.lft BETWEEN P2.lft AND P2.rgt
AND P1.name = "Bob"
ORDER BY P2.lft

我也可以通过添加limit&offset来找到level2 manager:

SELECT P2.* FROM Personnel AS P1, Personnel AS P2
WHERE P1.lft BETWEEN P2.lft AND P2.rgt
AND P1.name = "Bob"
ORDER BY P2.lft
LIMIT 2 OFFSET 1

在某些情况下,我可能有多个名为“Bob”的员工在不同的二级经理手下工作。二级经理名称是唯一的。

我需要一个查询来返回名为“Susan”的二级经理的所有名为“Bob”的员工。

编辑:我的查询只需要返回在“玛丽”下工作的“鲍勃”,因为他是唯一一个拥有名为“苏珊”的二级经理。

   Big Boss
   /      \
Brian   Susan
  |       |
Susan   Mary
  |       |
 Bob     Bob

【问题讨论】:

    标签: sql nested-sets


    【解决方案1】:

    输入数字:

      1 Big Boss 14
       /        \
    2 Brian 7  8 Susan 13
      |           |
    3 Susan 6  9 Mary 12
      |           |
    4 Bob 5    10 Bob 11
    

    如果我们可以指定我们知道它是8 的“Susan”,那么:

    SELECT employee.* 
    FROM Personnel AS employee
    inner join Personnel AS manager on employee.lft BETWEEN manager.lft
                                                        AND manager.rgt
    WHERE 
      employee.name = 'Bob'
      and manager.name = 'Susan'
      and manager.lft = 8
    ORDER BY employee.lft
    

    否则,我认为您需要了解有关记录的更多信息,才能指定您所说的经理。

    编辑:使查询更复杂一点,我使用来自this article 的建议计算了深度。 fiddle 也可以正常工作。

    select
      employee.*
    from
      Personnel employee
      inner join 
        (SELECT node.name, node.lft, node.rgt, (COUNT(parent.name) - 1) AS depth
         FROM Personnel AS node
         inner join Personnel AS parent on node.lft BETWEEN parent.lft AND parent.rgt
         GROUP BY node.name, node.lft, node.rgt) as manager
                     on employee.lft between manager.lft and manager.rgt    
    where
      employee.name = 'bob'
      and manager.name = 'susan'
      and manager.depth = 1
    

    【讨论】:

    • 非常感谢,但是这会从树中返回两个 Bob,而我需要具体到苏珊在第 2 级的那个。
    • 以前从未使用过小提琴,所以我希望这是正确的。 sqlfiddle.com/#!2/fc0d9/1
    • 由于 2 级的苏珊是独一无二的,我希望能够仅指定名称。
    • 你可以考虑添加一个level 列,如this example 然后你可以说where manager.level = 2 and manager.name = 'susan'
    • 另一个想法是拿 big boss.rgt - 1 来设置你的第二级。
    猜你喜欢
    • 2022-09-28
    • 2010-10-30
    • 1970-01-01
    • 2014-07-21
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    相关资源
    最近更新 更多