mysql树节点路径,关于mysql:从使用物化路径编码树的表中选择,按深度优先排序(无递归/ ltree)...
我在關(guān)系數(shù)據(jù)庫中有一個表,其中我使用稱為物化路徑(也稱為Lineage列)的技術(shù)對樹進行編碼。 也就是說,對于我樹中的每個節(jié)點,我在表中有一行,并且對于每一行,我有一個名為ancestry的字符串列,其中我存儲從根節(jié)點到該行所表示的節(jié)點的路徑。
是否有可能,如果是 - 如何選擇按順序排序的表中的行,那么它們應(yīng)該按照訪問樹深度優(yōu)先的結(jié)果順序出現(xiàn)在結(jié)果集中。 我使用MySQL - 所以沒有遞歸查詢和沒有l(wèi)tree擴展。
例如,樹,它的表,并按預(yù)訂順序排序:
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
注意:我對通過物化路徑編碼明確感興趣!
相關(guān):在關(guān)系數(shù)據(jù)庫中存儲分層數(shù)據(jù)有哪些選項?
相似的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之前出現(xiàn)。但是,你說你不關(guān)心兄弟訂購。 當(dāng)然,我會將其重寫為嵌套集;)
我可能會將它重寫為嵌套集,因為我有很多短樹。 事情是我的數(shù)據(jù)已經(jīng)是"物化路徑"自然編碼(域名準確地說是a.b.c)。 我將不得不思考一段時間,因為我不太確定它是否有效,在一般情況下。
這將按你的"祖先"的最后一個數(shù)字排序
select *,
Substring(ancestry,LEN(ancestry) - Charindex('/',Reverse(ancestry))+2, LEN(ancestry)) as END_CHAR
from nodes
order by END_CHAR desc
我沒有嘗試使用大于9的數(shù)字,你可能需要轉(zhuǎn)換為int
對不起,剛才意識到這不能回答你的問題,我誤解了。 生病離開查詢,它可能會給你一些想法。
總結(jié)
以上是生活随笔為你收集整理的mysql树节点路径,关于mysql:从使用物化路径编码树的表中选择,按深度优先排序(无递归/ ltree)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交通灯程序设计C语言,基于MCS-51的
- 下一篇: 《零基础》MySQL 选择数据库(七)