У меня есть таблица в реляционной базе данных, в которой я кодирую дерево, используя технику, известную как Материализованный путь (также известный как столбец 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
Примечание. Я явно заинтересован в том, чтобы сделать это с кодировкой материализованного пути!
Связано: -data-in-a-relational-database">Какие существуют варианты хранения иерархических данных в реляционной базе данных?