1

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'は、何も配置せず&nbsp;、フラットツリーを表示し'mobile'ます。次のよう"mobile"に表示されます。

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

だから私の質問は:

  1. 特定のノードのツリーを表示するにはどうすればよいですか?
  2. すべてのルートカテゴリのみを表示するにはどうすればよいですか?単一のSQLクエリを使用して、子なし、サブなし?
4

1 に答える 1

0
  1. テーブル構造とクエリを調べた後、追加のサブクエリなしで特定のノードのツリーを選択する方法はないと思います(私は間違っているかもしれませんが、これが私がそれを機能させる唯一の方法ですテスト中)。FROMこれを行うには、3番目のテーブルから選択する場合と同じように、サブクエリを句に追加することをお勧めします。次に、句にBETWEEN条件を 追加してテストします。WHERE

    このようなもの:

    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;
    

    これを使用して、サブクエリでツリーを取得する「どの」ノードを処理するすべてのロジックを追加する必要があります。最初の2つのテーブル(nおよびp)が選択されます-通常どおりから。これは、適切なdepth値を取得するために必要です。次に、比較pしてq-しかしq、すでに制限されています。したがって、適切なdepth 値を取得したら、必要なカテゴリのみに制限します。

  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;
    
于 2012-10-03T13:19:36.507 に答える