DB構造は次のとおりです。
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
1つのカテゴリとそのすべてのサブキャットを取得するために使用している次のクエリ:
$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'
いるすべての深さを使用して1つのノードのみを取得する場合'0'
は、何も配置せず
、フラットツリーを表示し'mobile'
ます。次のよう"mobile"
に表示されます。
Mobile
Nokia
Nokia Sub 1
Nokia Sub 2
Nokia Sub 3
Samsung
Galaxy
Micromax
だから私の質問は:
- 特定のノードのツリーを表示するにはどうすればよいですか?
- すべてのルートカテゴリのみを表示するにはどうすればよいですか?単一のSQLクエリを使用して、子なし、サブなし?