我在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),但我宁愿不这样做。
任何输入都会非常感激。
答案 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