Re: [請益] 該怎麼設計目錄的資料表呢!?
※ 引述《dinos (守護神)》之銘言:
: ※ 引述《kingoface (Vincent)》之銘言:
: : 狀況是這樣的,
: : 需要做一個類似目錄的東西。
: : 以下是類似的示意圖(不好意思,有點醜)比如:
: : A
: : A_test
: : A-1-1
: : A-file
: : B
: : B-111
: : B-123
: : 222
: : B-test2
: : B-BB
: : B-file
: : 目標是B-file
: : 那在資料表中
: : 該怎麼紀錄他是在 B-> 222 -> B-test2->B-BB 底下呢?
: : 是要在一個欄位中寫成
: : B:222:B-test2:B-BB
: : 然後利用:切割字串,還是有更好的方法嗎?
: 樹的話可以考慮MPTT(Modified Preorder Tree Traversal)
: 原理是使用節點的左右兩側紀錄上下關係,例如原本的樹長這樣
: A
: ┌──┴────┐
: B C
: ┌──┼──┐ ┌─┴─┐
: D E F G H
: ┌─┴─┐
: I J
: 分別在從頂端節點(A)的左側開始紀錄流水號,當有下層時先由下一層的最左側+1
: 當無下層時再往右側+1,若無右側時再到上層+1,直到回到 A
: 1A20
: ┌──┴────┐
: 2B9 10C19
: ┌──┼──┐ ┌─┴─┐
: 3D4 5E6 7F8 11G16 17H18
: ┌─┴─┐
: 12I13 14J15
: 比如要找 C 的子孫節點有哪些,那只要找左側數字大於10,且右側數字小於19
: G 父 小於11 大於16
: 跟另外兩種方式 一:像你的作法,紀錄完整節點
: 二:只紀錄 parent node
: 比較起來,mysql 的查詢操作上,特別是固定長度的資料表時
: 在新增或搬移節點時,MPTT 會比一二都來得沒效率
: 但在尋找或刪節點除時,MPTT 會比一二效率表現好上很多
: 若你的資料是不常異動(insert/update/delete)且經常要用來尋找(select)的話,
: 可以考慮一下 MPTT
依照大大提供的方法實作,找到了wiki的教學
建立好資料表後
id node left right level
1 index 1 20 0
2 pageB 2 13 1
3 pageC 3 6 2
4 pageD 4 5 3
5 pageE 7 12 2
7 pageF 8 11 3
8 pageG 9 10 4
9 pageBBB 14 19 1
10 pageCCC 15 18 2
11 pageDDD 16 17 3
利用
$sql="SELECT Child.Node, Child.LEFT, Child.RIGHT
FROM menu AS Child, menu AS Parent
WHERE
Child.level = Parent.level + 1
AND Child.LEFT > Parent.LEFT
AND Child.RIGHT < Parent.RIGHT
AND Parent.LEFT = 1";
可以找到index底下有兩個子目錄.
我分別在第一層和第二層做了兩次的搜尋
但是問題來了.....
如果今天可能有5~7層或是更多,那不就要有更多的搜尋語法
這時候可能需要有巢狀迴圈的概念,但是我完全不知道該把迴圈寫在哪...
以下是我的程式碼,請各位大大指點一下...m(_ _)m
//$sql 是指定找出index的子目錄
$sql="SELECT Child.Node, Child.LEFT, Child.RIGHT
FROM menu AS Child, menu AS Parent
WHERE
Child.level = Parent.level + 1
AND Child.LEFT > Parent.LEFT
AND Child.RIGHT < Parent.RIGHT
AND Parent.LEFT = 1";
$result_for = $mysqli->query($sql);
$html_tree.='<ol class="tree"><li><label for="subsubfolder2">index</label> <input type="checkbox"/><ol>';
while($row_ans = $result_for->fetch_array()){
//$sql_2找出子目錄以後,再找一次子目錄
$sql_2="SELECT Child.Node, Child.LEFT, Child.RIGHT
FROM menu AS Child, menu AS Parent
WHERE Child.level = Parent.level + 1
AND Child.LEFT > Parent.LEFT
AND Child.RIGHT < Parent.RIGHT
AND Parent.LEFT = '{$row_ans[1]}'";
$result_sub = $mysqli->query($sql_2);
$hmtl_tree_2='<ol>';
while($row_ans_2 = $result_sub->fetch_array()){
$hmtl_tree_2.='<li><label for="subsubfolder2">'.$row_ans_2['m_Node'].'</label> <input type="checkbox" /> </li>';
}
$hmtl_tree_2.='</ol>';
$html_tree.='<li><label for="subsubfolder2">'.$row_ans['m_Node'].'</label> <input type="checkbox" " />'.$hmtl_tree_2.'</li>';
}
$html_tree.='</ol></li></ol>';
我現在卡在子目錄中的子目錄,或是更多的子目錄,我應該怎麼找呢!?
是寫另外一個function嗎?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.124.195.130
→
06/18 11:32, , 1F
06/18 11:32, 1F
推
06/18 12:14, , 2F
06/18 12:14, 2F
→
06/18 12:16, , 3F
06/18 12:16, 3F
→
06/18 12:25, , 4F
06/18 12:25, 4F
→
06/18 12:25, , 5F
06/18 12:25, 5F
討論串 (同標題文章)
PHP 近期熱門文章
PTT數位生活區 即時熱門文章