sql - 计算层次结构中直接子代的数量

标签 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)是必要的,但我宁愿不这样做。

如有任何意见,我们将不胜感激。

最佳答案

您可能可以使用子查询来做到这一点:

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

关于sql - 计算层次结构中直接子代的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3387980/

相关文章:

mysql - 创建 View 连接两个具有相同列且没有重复的表

mysql - 如何mysql连接两列并仅从连接表中获取最新记录?

r - 计算 r 中的有效行数

jquery - 使用 Jquery 查找具有特定属性的文本区域的数量

mysql - SQL根据列之间交换的两个键查找重复记录

sql - 将子记录添加到新列而不是新行

mysql - 创建包含多个表的 View ?

Mysql选择上周用户每天的帖子总数

mysql - 如何连接两个sql查询?

sql - 将查询从 Firebird 转换为 PostgreSQL