Выберите из таблицы, которая использует материализованный путь для кодирования дерева, упорядоченного по глубине (без рекурсии / ltree)

У меня есть таблица в реляционной базе данных, в которой я кодирую дерево, используя технику, известную как Материализованный путь ( также известный как столбец Lineage). То есть для каждого узла в моем дереве у меня есть строка в таблице, и для каждой строки у меня есть строковый столбец с именем ancestry , где я сохраняю путь от корневого узла к узлу, представленному этой строкой. .

Возможно ли, и если да, то как выбрать строки в таблице, упорядоченные по предварительному порядку , то есть они должны появиться в результирующем наборе в том порядке, в котором это произойдет при посещении дерева в глубину . Я использую MySQL - поэтому нет рекурсивных запросов и нет расширения ltree .

Например, дерево, его таблица и выбранные отсортированы по предварительному порядку:

 1        SELECT * FROM nodes   SELECT * FROM nodes ORDER BY ?depth_first_visit_order?
| \       id | ancestry         id | ancestry
2   3     -------------         -------------
|  | \    1  | NULL             1  | NULL           NOTE: I don't care about the
4  5  6   2  | 1                2  | 1                    order of siblings!
   |      3  | 1                4  | 1/2
   7      4  | 1/2              3  | 1
          5  | 1/3              5  | 1/3
          6  | 1/3              7  | 1/3/5
          7  | 1/3/5            6  | 1/3

Примечание: я явно заинтересован в том, чтобы сделать это с использованием кодировки материализованного пути!
По теме: Какие есть варианты хранения иерархических данных в реляционной базе данных?

6
задан Community 23 May 2017 в 09:59
поделиться