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
對不起,剛才意識到這不能回答你的問題,我誤解了。 生病離開查詢,它可能會給你一些想法。
總結
以上是生活随笔為你收集整理的mysql树节点路径,关于mysql:从使用物化路径编码树的表中选择,按深度优先排序(无递归/ ltree)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交通灯程序设计C语言,基于MCS-51的
- 下一篇: matlab 当已知两个矩阵满足分别一定