mysql树节点路径,关于mysql:从使用物化路径编码树的表中选择,按深度优先排序(无递归/ 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

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

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

相似的stackoverflow.com/questions/2797720/…

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

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之前出现。但是,你说你不关心兄弟订购。 当然,我会将其重写为嵌套集;)

我可能会将它重写为嵌套集,因为我有很多短树。 事情是我的数据已经是"物化路径"自然编码(域名准确地说是a.b.c)。 我将不得不思考一段时间,因为我不太确定它是否有效,在一般情况下。

这将按你的"祖先"的最后一个数字排序

select *,

Substring(ancestry,LEN(ancestry) - Charindex('/',Reverse(ancestry))+2, LEN(ancestry)) as END_CHAR

from nodes

order by END_CHAR desc

我没有尝试使用大于9的数字,你可能需要转换为int

对不起,刚才意识到这不能回答你的问题,我误解了。 生病离开查询,它可能会给你一些想法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值