sql 层级数

sql hierarchy count

我有一个名为 sql table 的 id 及其 parent 的 id(其中 0 表示没有 parent),如下所示:

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

从这个 table 我需要一个 sql 查询到 return 一个 table 每个 id 的 children 的数量应该导致以下:

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

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

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

您可以使用 group by on parentId,

仅限 children 的成员:

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

编辑:

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

select
    parentId,
    COUNT(*)
from Parentids
group by
    parentId
order by
    2,1

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

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

您可以使用以下内容:

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