Получить иерархию из родительской связанной базы данных

У меня есть существующая (старая) структура базы данных sqlite, которая выглядит так:

╔══════════╦═══════════╦══════════╗
║ id_group ║ id_parent ║ sequence ║
╠══════════╬═══════════╬══════════╣
║        1 ║         0 ║        0 ║
║       10 ║         1 ║       70 ║
║      117 ║        10 ║       30 ║
║      124 ║       117 ║       40 ║
║      174 ║      3998 ║       60 ║
╚══════════╩═══════════╩══════════╝

Где id_parent указывает на другой id_group для создания иерархии.

Как я могу создать запрос, который предоставит мне всю иерархию за один раз? Конечно, я мог бы просто просмотреть все id_parent и записать каждый уровень иерархии, но это кажется ненужным и утомительным.

PS: Если это невозможно с одним только SQL, я также могу использовать PHP, C #, Python и другие.


person F.P    schedule 15.04.2014    source источник


Ответы (1)


Если вы используете текущую версию SQLite, вы можете использовать (соответствующий стандарту ANSI) рекурсивный запрос:

with recursive group_tree as (
  select id_group, 
         id_parent, 
         sequence
  from groups
  where id_parent = 0 -- marks the start of your tree
  union all
  select c.id_group, 
         c.id_parent,
         c.sequence
  from groups p
    join group_tree c on p.id_group = c.id_parent
) 
select *
from group_tree;

Если вы хотите начать с любого другого места в иерархии, просто замените where id_parent = 0 на, например, where id_group = 10, чтобы получить всех детей этой группы.

Более подробная информация в руководстве: https://www.sqlite.org/lang_with.html.

person a_horse_with_no_name    schedule 15.04.2014