2012-10-03 24 views
1

數據庫結構如下:如何顯示並正確縮進單個節點的樹結構?

cat_ID| cat_name | cat_nicename | lft | rgt 
    _________________________________________________ 
    287 | Wallpapers | wallpapers | 61 | 62 
    1656 | Gadget  | gadget  | 63 | 64 
    1958 | Sms   | sms   | 65 | 66 
    2901 | fun   | fun   | 67 | 68 
    4419 | Joke  | joke   | 69 | 70 
    4775 | health  | health  | 71 | 72 
    5098 | Mobile  | mobile  | 73 | 90 
    5100 | TV   | tv   | 91 | 92 
    5101 | Main  | main   | 93 | 94 
    5102 | Nokia  | nokia  | 76 | 83 
    5103 | Samsung  | samsung  | 84 | 87 
    5104 | Micromax | micromax  | 88 | 89 
    5105 | Nokia Sub 1 | nokiasub1 | 77 | 78 
    5106 | Nokia Sub 2 | nokiasub2 | 79 | 82 
    5107 | Nokia Sub 3 | nokiasub3 | 80 | 81 
    5109 | Galaxy  | galaxy  | 85 | 86 

的Folloing查詢我使用獲得一類,這一切的subcats:

$sql = "SELECT n.cat_ID,n.cat_name,n.cat_nicename, (COUNT(*)-1) 
AS depth FROM " .TBL_CATEGORIES. " AS n, " .TBL_CATEGORIES. " AS p 
    WHERE p.cat_nicename='mobile' 
AND n.lft BETWEEN p.lft AND p.rgt 
GROUP BY n.lft ORDER BY n.lft;"; 

$result = mysql_query($sql); 

$tree = array(); 
while ($row = mysql_fetch_assoc($result)) { 
    $tree[] = $row; 
} 

function _tab($depth) { 
    $tabs = ''; 
    while ($depth-- > 0) $tabs .= '    '; 
    return $tabs; 
} 

// bootstrap loop 
$result = ''; 
while (!empty($tree)) { 
    $currNode = array_shift($tree); 
    $result .= _tab($currNode['depth']) . $currNode['cat_name'] . $currNode['depth'].'<br />'; 
} 

print $result; 

如果我不使用p.cat_nicename='mobile',通過上面的代碼,樹結構顯示完美,但如果我想通過使用p.cat_nicename='mobile'檢索只有一個節點我得到的所有深度是'0',因此它不會放置任何&nbsp;和顯示扁平樹在'mobile' ..如果我查詢只是"mobile"我T應當顯示一個類似:

Mobile 
    Nokia 
     Nokia Sub 1 
     Nokia Sub 2 
      Nokia Sub 3 
    Samsung 
     Galaxy 
    Micromax 

所以我的問題是:

  1. 我怎樣才能顯示一個特定節點的樹?
  2. 如何僅顯示所有根類別?沒有孩子沒有子,通過使用單個SQL查詢?
+0

嗨@newfurniturey如果你有時間..你可以請看看嗎?很多thanx – user1713941

回答

0
  1. 通過表結構和查詢看後,我不認爲 有一種方法來選擇一個特定節點的樹沒有 附加的子查詢(我可能是錯的,但這是我測試時能夠使其工作的唯一方式)。爲此,我建議 將子查詢添加到FROM子句中,就好像您從第3個表中選擇 一樣。然後,在您的 WHERE子句中添加額外的BETWEEN條件以對其進行測試。

    事情是這樣的:

    SELECT 
        n.cat_ID, n.cat_name, n.cat_nicename, COUNT(*)-1 AS depth 
    FROM 
        categories AS n, 
        categories AS p, 
        (SELECT lft, rgt FROM categories WHERE cat_nicename = 'mobile') AS q 
    WHERE 
        n.lft BETWEEN p.lft AND p.rgt 
        AND p.lft BETWEEN q.lft AND q.rgt 
    GROUP BY n.lft 
    ORDER BY n.lft; 
    

    利用這一點,你需要添加所有的邏輯處理 節點,你希望得到一個樹的子查詢「它」。正常情況下選擇前兩個 表(np)。這需要 才能獲得正確的depth值。 然後,它比較pq- 但是q已經是有限的。因此,一旦您擁有正確的值,您就可以將其限制爲只有您想要的類別。

  2. 僅顯示所有根類別要容易得多。使用您的 查詢,「根類別」的定義是depth = 0。如果您使用MySQL的HAVING子句,則可以使用HAVING depth = 0輕鬆檢查它 。請嘗試以下操作:

    SELECT 
        n.cat_ID, n.cat_name, n.cat_nicename, COUNT(*)-1 AS depth 
    FROM 
        categories AS n, 
        categories AS p 
    WHERE 
        n.lft BETWEEN p.lft AND p.rgt 
    GROUP BY n.lft 
    HAVING depth = 0 
    ORDER BY n.lft; 
    
+0

作品完美.. @newfurniturey謝謝你是一個非常小的詞,像你這樣的人。愛與關懷 – user1713941

+0

Buddy [email protected]一個簡單的問題,如果你可以回答:我怎樣才能得到Bootstrap循環中的下一個深度值?像$ currNode ['depth']它是一個當前深度..我將如何獲得下一個深度值? – user1713941