Sql 计数嵌套树用户数

Sql 计数嵌套树用户数,sql,sql-server-2005,recursion,Sql,Sql Server 2005,Recursion,我想计算用户1下有多少成员。 为此,我创建了一个只计算左侧的函数 所以它像1->2->3。所以它是2。 在计算右侧时也做了同样的事情 因此,如果没有更具体的问题定义,如何计算“所有边”的意思是“左”和“右”,就很难提供很好的帮助。然而,如果你能数一数左边的条目,听起来你已经完成了一半 不要计算左手边的条目,而是尝试计算两边的条目。此的Psuedo代码如下所示: id left_User_ID right_User_ID referral_Id -- ------------ -----

我想计算用户1下有多少成员。 为此,我创建了一个只计算左侧的函数

所以它像1->2->3。所以它是2。 在计算右侧时也做了同样的事情


因此,如果没有更具体的问题定义,如何计算“所有边”的意思是“左”和“右”

,就很难提供很好的帮助。然而,如果你能数一数左边的条目,听起来你已经完成了一半

不要计算左手边的条目,而是尝试计算两边的条目。此的Psuedo代码如下所示:

id  left_User_ID  right_User_ID  referral_Id
--  ------------  -------------  -----------
1   2             5              1
2   3             4              1
3   null          null           2
如果您使用的任何后端语言都有一个树结构库,我希望已经提供了类似的函数

编辑:

在揭示了我们确实有一个树表结构,可以在SQL中查询之后-

表:

public static int leafCount(Node node) {
   if (node == null) {
       return 0;
   }

   return 1 + leafCount(node.left) + leafCount(node.right);
}
数据:

CREATE TABLE RECURSE (ID INT NOT NULL WITH DEFAULT, 
                      R_SIDE INT NOT NULL WITH DEFAULT, 
                      L_SIDE INT NOT NULL WITH DEFAULT)   
结果设置:

INSERT INTO RECURSE VALUES (1, 2, 5)
                           (2, 3, 4)
                           (3, 0, 0)
                           (4, 0, 0)
                           (5, 0, 0)
此语句将返回左侧和右侧节点的计数。至少在DB2下,似乎存在一些限制,使得在递归CTE中很难使用左连接,因此必须分别计算左连接和右连接。如果它不能完全满足您的需求,请以此为起点

Id    R_Side    L_Side
 1    2         5
 2    3         4
 3    0         0
 4    0         0
 5    0         0
收益率:

WITH left_side (id, count) as (SELECT id, 0
                               FROM recurse
                               WHERE L_Side = 0
                               UNION ALL
                               SELECT a.id, 1 + b.count
                               FROM recurse as a
                               JOIN left_side as b
                               ON b.id = a.l_side
                               where a.l_side > 0),

     right_side (id, count) as (SELECT id, 0
                                FROM recurse
                                WHERE R_Side = 0
                                UNION ALL
                                SELECT a.id, 1 + b.count
                                FROM recurse as a
                                JOIN right_side as b
                                ON b.id = a.R_Side
                                where a.l_side > 0)

SELECT a.id, COALESCE(b.count, 0) + COALESCE(c.count, 0) as LeafCount
FROM recurse as a
LEFT JOIN right_side as b
ON b.id = a.id
LEFT JOIN left_side as c
ON clid = a.id

如果对问题没有更具体的定义,就很难提供好的帮助。然而,如果你能数一数左边的条目,听起来你已经完成了一半

不要计算左手边的条目,而是尝试计算两边的条目。此的Psuedo代码如下所示:

id  left_User_ID  right_User_ID  referral_Id
--  ------------  -------------  -----------
1   2             5              1
2   3             4              1
3   null          null           2
如果您使用的任何后端语言都有一个树结构库,我希望已经提供了类似的函数

编辑:

在揭示了我们确实有一个树表结构,可以在SQL中查询之后-

表:

public static int leafCount(Node node) {
   if (node == null) {
       return 0;
   }

   return 1 + leafCount(node.left) + leafCount(node.right);
}
数据:

CREATE TABLE RECURSE (ID INT NOT NULL WITH DEFAULT, 
                      R_SIDE INT NOT NULL WITH DEFAULT, 
                      L_SIDE INT NOT NULL WITH DEFAULT)   
结果设置:

INSERT INTO RECURSE VALUES (1, 2, 5)
                           (2, 3, 4)
                           (3, 0, 0)
                           (4, 0, 0)
                           (5, 0, 0)
此语句将返回左侧和右侧节点的计数。至少在DB2下,似乎存在一些限制,使得在递归CTE中很难使用左连接,因此必须分别计算左连接和右连接。如果它不能完全满足您的需求,请以此为起点

Id    R_Side    L_Side
 1    2         5
 2    3         4
 3    0         0
 4    0         0
 5    0         0
收益率:

WITH left_side (id, count) as (SELECT id, 0
                               FROM recurse
                               WHERE L_Side = 0
                               UNION ALL
                               SELECT a.id, 1 + b.count
                               FROM recurse as a
                               JOIN left_side as b
                               ON b.id = a.l_side
                               where a.l_side > 0),

     right_side (id, count) as (SELECT id, 0
                                FROM recurse
                                WHERE R_Side = 0
                                UNION ALL
                                SELECT a.id, 1 + b.count
                                FROM recurse as a
                                JOIN right_side as b
                                ON b.id = a.R_Side
                                where a.l_side > 0)

SELECT a.id, COALESCE(b.count, 0) + COALESCE(c.count, 0) as LeafCount
FROM recurse as a
LEFT JOIN right_side as b
ON b.id = a.id
LEFT JOIN left_side as c
ON clid = a.id

这是递归…只有在sql中使用cte才能实现递归。我使用了MSSQLServer2005。我试着用这个来计算左侧节点 这里我的桌子名是LEG

左创建函数_legs@idint 返回varchar4作为开始 声明@count int set@count=0而@id=0 开始 set@id=castSELECT left_user_Id from Leg,其中Id=@idas varchar4 如果@id!=0 开始 设置@count=@count+'1' 终止 终止 返回@count 终止 此函数仅在一个方向上计算左节点总数。
这是递归…只有在sql中使用cte才能实现递归。我使用了MSSQLServer2005。我试着用这个来计算左侧节点 这里我的桌子名是LEG

左创建函数_legs@idint 返回varchar4作为开始 声明@count int set@count=0而@id=0 开始 set@id=castSELECT left_user_Id from Leg,其中Id=@idas varchar4 如果@id!=0 开始 设置@count=@count+'1' 终止 终止 返回@count 终止 此函数仅在一个方向上计算左节点总数。
... 您已经用SQL标记了它,但我没有看到任何特定于SQL的内容,甚至没有看到任何指示正在使用数据库的内容……调用函数以向左计数并存储答案。调用函数以正确计数并存储答案。把这两个答案加起来。。。。您已经用SQL标记了它,但我没有看到任何特定于SQL的内容,甚至没有看到任何指示正在使用数据库的内容……调用函数以向左计数并存储答案。调用函数以正确计数并存储答案。将这两个答案相加。但我想得到节点1下的节点总数。这是4。仍然不知道如何通过SQL2005中的CTE实现,但我想获得节点1下的节点总数。这是4。仍然不知道如何通过SQL2005中的CTE实现上述概念,以及如何在MS sql 2005中实现上述概念。这是递归..但不知道如何使用CTE实现。如何在MS sql 2005中实现上述概念。这是递归,但不知道如何用CTE实现。