2016-07-09 11 views
0

あなたの一部のMySQLのエキスパートが私を助けてくれることを願っています。mysqlはネストされたセットツリー用の特別なデータを取得します

ツリーに隙間がある場合は、より深い子供が欲しいとは限りません。

例:

id | parent_id | lft | rgt | depth | title 
:深さ3のノードは無効である。この場合

root (depth 0) 
sub-cat 1 (depth 1) 
subsub-cat 1 (depth 2) 
subsubsubsub-cat 1 (depth 4) 

、iはノードsubsubsubsub-CAT 1深い

構造を必要としません

デフォルトのクエリ:

select * 
from categories 
where lft >= '1' and lft < '10000' 
order by lft asc 

ありがとう!

+0

ネストされたセットは、あなたが特別なもののため、全体のパスをチェックする必要はありませんので(それだけですべてのノードがかかりますが存在します2つの数字の間には、ギャップについてあまり気にしない)ので、(簡単に)可能ではありません。ノードを削除するときには、すべての子を削除してください(これは、標準のネストされたセットアルゴリズムで行われます)。何らかの理由でノードを保持したい場合は、別の隠しサブツリーに移動するか、列を追加してから、それらを削除せずに未使用/隠しとしてマークします。 – Solarflare

+0

ありがとう、おそらくistできませんが、私はカテゴリを削除したくない、私は親カテゴリを無効にする場合、子供を非表示にしたい。 例: 衣類>メンズ>ジーンズ>スリム ジーンズが無効になっている場合は、スリムでツリーに表示しないでください。 – Tom

+0

ノードが無効になっているかどうかはどのように判断できますか? – Strawberry

答えて

0

ギャップ(「削除された中間ノード」のように、またはジャンプdepthの値)が検出されにくい、またはネストされたセットで定義することさえ難しい(これらのカラムはネストされたセットには必要ありません)。ノードとそのすべての子を非表示にしたい場合は、ツリーにマーカー列を追加することで簡単に行うことができます。 hidden、そして唯一の隠れ前任者(または身を隠されている)を持っていないこれらのノードを使用します。

select * 
from categories as node 
where not exists 
    (select 1 from categories as preds 
    where node.lft >= preds.lft 
     and node.rgt <= preds.rgt 
     and preds.hidden = 1) 
order by node.lft; 
+0

素晴らしい、完璧、ありがとう! – Tom

+0

もう1つの質問: おそらく、あなたは検索結果の先祖ノードをどのように取得するか考えているかもしれません。 など。スリムでスリムなジーンズを見つけたら、祖先のみを見せてください。服>メンズ>ジーンズ>。 私は1つの結果があり、ノードのみを表示します 衣類>メンズ>ジーンズ>スリム。 – Tom

+0

@Tomはい、そのパスを取得することはネストされたセットの完全な標準クエリです。 [MySQLでの階層データの管理](http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/)(深さとparent_idも計算する例があるので、 – Solarflare

関連する問題