我在 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/