Рассчитать количество прямых детей в иерархии - PullRequest
3 голосов
/ 02 августа 2010

У меня есть простая иерархия категорий в базе данных SQLite3, каждая строка хранит родительский идентификатор или NULL в зависимости от ситуации.

Я хотел бы выяснить, является ли конкретная категория листом, по сути, определив для каждой строки, определен ли для нее родительский идентификатор. Или, скорее, определение количества дочерних строк для каждой строки.


Определение таблицы:

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

Это кажется потенциально простым (?), Но, поскольку я, как правило, теряюсь за пределами простых СОЕДИНЕНИЙ, я до сих пор не слишком далеко продвинулся в этом. Я проверил похожие вопросы, но они, кажется, объединяются между таблицами или хотят сделать более сложный подсчет всех дочерних элементов в иерархии, а не только прямых дочерних строк.

Возможно изменение схемы таблицы (например, если child_id или child_count), но я бы не хотел.

Любой вклад был бы наиболее ценным.

1 Ответ

3 голосов
/ 02 августа 2010

Вы, вероятно, могли бы сделать это с помощью подзапроса:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...