计算层次结构中直接子项的数量

时间:2010-08-02 13:00:46

标签: sql join count sqlite

我在SQLite3数据库中有一个简单的类别层次结构,每一行都存储父ID或NULL

我想知道某个特定类别是否是一个叶子,主要是通过为每一行确定它是否定义了父ID。或者更确切地说,确定每行的子行数。


表格定义:

CREATE TABLE category (
    id INTEGER PRIMARY KEY AUTOINCREMENT
    name TEXT NOT NULL
    parent_id INTEGER DEFAULT NULL
);

示例数据:

id          name        parent_id 
----------  ----------  ----------
34          People      
35          Countries   
36          USA         35
37          Pop         36
38          Rock        36
39          Japan       35
40          Pop         39
42          Rock        39
43          J-Pop       40

期望的输出:
原始数据加上每行有多少个子类别(子)的数量。

id          name        parent_id   direct_children
----------  ----------  ----------  ---------------
34          People                  0
35          Countries               2
36          USA         35          2
37          Pop         36          0
38          Rock        36          0
39          Japan       35          2
40          Pop         39          1
42          Rock        39          0
43          J-Pop       40          0

这似乎很简单(?),但由于我通常会失去简单的JOIN,所以到目前为止我还没有达到这个目标。我已经检查了类似的问题,但是它们或者似乎是跨表连接,或者想要对层次结构中的所有子项进行更复杂的计数,而不仅仅是直接的子行。

有可能更改表模式(例如,如果有child_id或child_count),但我宁愿不这样做。

任何输入都会非常感激。

1 个答案:

答案 0 :(得分:3)

你可以用子查询来做到这一点:

select  c.*
,       (select count(*) from category c2 where c2.parent_id = c.id) 
            as direct_children
from    category c

或加入:

select  parent.id
,       parent.name
,       parent.parent_id
,       count(child.id) as direct_children
from    category parent
left join    
        category child
on      child.parent_id = parent.id
group by
        parent.id
,       parent.name
,       parent.parent_id