sql层次结构计数

时间:2016-02-02 17:06:32

标签: mysql sql sum hierarchy

我有一个名为Parentids of id的sql表及其父ID(其中0代表没有父代),如下所示:

id | parentid
--------------
1  |   0
2  |   0
3  |   1
4  |   0
5  |   2
6  |   2
7  |   3
8  |   1

从这个表中我需要一个sql查询来返回一个表,其中包含应该导致以下内容的每个id的子项数:

id | childrenCnt
--------------
1  |   2
2  |   2
3  |   1
4  |   0
5  |   0
6  |   0
7  |   0
8  |   0

我有以下sql查询但它似乎不起作用:

SELECT id
    ,sum(CASE 
            WHEN parentid = tid
                THEN 1
            ELSE 0
            END) AS childrenCnt
FROM Parentids

4 个答案:

答案 0 :(得分:0)

一种方法是使用left join和聚合。但是,相关子查询甚至可能更好:

select p.id,
       (select count(*)
        from parentids p2
        where p2.parentid = p.id
       ) as childrenCnt
from parentids p;

答案 1 :(得分:0)

您可以在parentId

上使用分组进行此操作

只有有孩子的成员:

}

修改

所有成员,以匹配确切的OP预期结果:

select
    parentId,
    COUNT(*)
from Parentids
where
    parentId <> 0
group by
    parentId

答案 2 :(得分:0)

你可以GROUP BY parentids然后删除id = 0(第一行)的记录。所以试试这段代码:

select parentid as id, count(*) as childrenCnt
from Parentids
where id <> 0
group by id

答案 3 :(得分:0)

您可以使用以下内容:

SELECT    p.id,
          COUNT(DISTINCT ch.id) AS childrenCnt
FROM      Parentids p
LEFT JOIN Parentids ch ON p.id = ch.parentid
GROUP BY  p.id;

它会生成您指定的输出。

SQL Fiddle