回答问题

我在关系数据库中有一个表,我在其中使用称为物化路径(也称为沿袭列)的技术对树进行编码。也就是说,对于树中的每个节点,我在表中有一行,对于每一行,我都有一个名为ancestry的字符串列,其中存储从根节点到该行表示的节点的路径。

是否有可能,如果是 - 如何选择表中按 preorder 排序的行,即它们应该按照访问树深度优先产生的顺序出现在结果集中.我使用 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

注意:我对通过物化路径编码明确感兴趣!

相关:在关系数据库中存储分层数据的选项有哪些?

Answers

我相信你想要的是字母排序。

SELECT id, ancestry, ancestry + '/' + CAST(id as nvarchar(10)) AS PathEnumeration
FROM nodes
ORDER BY 3 ASC;

我真的不记得 MySQL 是如何连接的,但我确信我的意思很清楚。

1
1/2
1/2/4
1/3
1/3/5
1/3/5/7
1/3/6

请注意,它是字母排序,因此 11 将出现在 2 之前。但是,您说您不关心兄弟排序。当然,我会将其重写为嵌套集;)

Logo

华为、百度、京东云现已入驻,来创建你的专属开发者社区吧!

更多推荐