【问题标题】:Calculate the number of direct children in a hierarchy计算层次结构中的直接子节点数
【发布时间】:2011-03-24 05:05:06
【问题描述】:

我在 SQLite3 数据库中有一个简单的类别层次结构,每行存储一个父 ID 或 NULL(视情况而定)。

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


表定义:

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

样本数据:

id 名称 parent_id ---------- ---------- ---------- 34 人 35个国家 36 美国 35 37 流行 36 38 摇滚 36 39 日本 35 40 流行 39 42 摇滚 39 43 日本流行音乐 40

所需的输出:
原始数据加上每行有多少子类别(子类别)的计数。

id 名称 parent_id direct_children ---------- ---------- ---------- --------------- 34 人 0 35 个国家 2 36 美国 35 2 37 流行 36 0 38 摇滚 36 0 39 日本 35 2 40 流行 39 1 42 摇滚 39 0 43 日本流行音乐 40 0

这看起来可能很简单(?),但由于我通常会迷失在简单的 JOIN 之外,所以到目前为止我还没有走得太远。我检查了类似的问题,但它们似乎是跨表连接,或者想要对整个层次结构中的所有子级进行更复杂的计数,而不仅仅是直接子级行。

可能需要更改表架构(例如,如果 child_id 或 child_count),但我不想这样做。

任何意见将不胜感激。

【问题讨论】:

    标签: sql join count sqlite


    【解决方案1】:

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

    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
    

    【讨论】:

    • 啊,像子查询一样简单!两者都在 SQLite 中工作得很好。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    相关资源
    最近更新 更多