iT邦幫忙

0

mysql 無限層級取值方式

好像有人問過,不過查不到資料
已規劃單表無限層級的表格(類似下圖)
https://ithelp.ithome.com.tw/upload/images/20190812/20108694kp0io4WJzO.png

想詢問之後取值如何用一次SQL依以下結構取出? 需要增加什麼欄位記錄?
父階層
子階層
子階層
父階層
子階層
子階層

看更多先前的討論...收起先前的討論...
石頭 iT邦高手 1 級 ‧ 2019-08-12 10:43:01 檢舉
如果你的mysql版本支援 CTE 可以使用CTE遞迴
石頭 iT邦高手 1 級 ‧ 2019-08-12 10:51:24 檢舉
https://stackoverflow.com/questions/20215744/how-to-create-a-mysql-hierarchical-recursive-query
石頭 iT邦高手 1 級 ‧ 2019-08-12 10:51:25 檢舉
多的一行
Allenci iT邦新手 5 級 ‧ 2019-08-12 14:19:04 檢舉
更新回覆在下方!
如果用遞迴,感覺跟分次查詢效率好不了多少
不用遞迴,就是表格內把階層表達清楚,然後用階層直接排序輸出
如果要到網頁顯示,用判斷式去判斷做縮排,畫面會更直接了當
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
小魚
iT邦大師 1 級 ‧ 2019-08-12 10:33:25

我其實沒有實際做過這樣的,
之前有做一個層級的是有最大的層級,
所以我是用偷懶的方式,
不過我怎麼覺得這個用後端來做會比較方便...

小魚 iT邦大師 1 級 ‧ 2019-08-12 10:50:40 檢舉

看完firecold大大的留言,
讓我想到一個方式,
不知道實不實用,
也是後面加一個PATH的欄位,
可是在新增修改的時候,
PATH裡面記錄著路徑,
下一層的路徑就把上一層的路徑再加上一層的ID,
但是這種作法在UPDATE的時候要處理所有受影響的路徑,
(其實有想到用Replace的方式)
不確定這樣到底實不實用...

1
firecold
iT邦新手 1 級 ‧ 2019-08-12 10:34:09

你說的感覺好像是這個
https://dotblogs.com.tw/rhinogoat/2018/04/20/203523

但我現在都用Nested tree做比較多

小魚 iT邦大師 1 級 ‧ 2019-08-12 10:52:35 檢舉

我有個問題,
為什麼前面跟後面要有個.呢?
如果沒有.不行嗎?

firecold iT邦新手 1 級 ‧ 2019-08-12 10:58:25 檢舉

Convert(nvarchar(150),CONCAT(TreeNode.Path , '->','.',DataSource.[Id],'.')
這段convert改掉應該就可以了
實際應用我沒有用過,只是剛好看到
不過這篇範例好像事mssql
有沒有相容必須try看看

小魚 iT邦大師 1 級 ‧ 2019-08-12 18:03:13 檢舉

看起來是MS-SQL沒錯

0
Allenci
iT邦新手 5 級 ‧ 2019-08-12 14:26:37

關於無限層級當年好像 google 很久找不到有什麼好辦法解決可以實際解決階層無限擴展的方式,後來前輩傳授的遞迴解法:

AA
AAAA
AAAB
AAAC
AAAAAA
AAAAAB
AAAAAC
...
AB
ABAA
ABAB
ABAC
ABAAAA
ABAAAB
ABAAAC
...
...

這樣定義階層的可擴充數量應該足夠應付所需的階層數了,當然根結點是所有樹狀排序的依據,所以可能需要限制不可更動根結點否則整串分類都爆炸~以上給樓主參考

我要發表回答

立即登入回答