で
おかげで私は近くに同一のデータのツリーを設定し、上記文書で提案方法を使用して問題を作成しました
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
あなたは、これが読み与える示唆します親と兄弟をnレベルまで決定することになると、特に簡単になります。
短いバージョンでは、各ノードの「左」と「右」に番号を割り当て、それを使用してツリーのセグメントを非常に効率的に選択できます。より長いバージョンの記事はこの記事にあり、私ができるよりはるかに徹底的に説明し、有用なMySQLコードを含んでいます。
ここでは、タイプごとに固有のデータが必要な場合は、あなたが彼らのために別々のテーブルを作成することができ、あなたのメインテーブル
treeTable (
// ID field
id INT UNSIGNED PK AI,
// Fields for branching
lft INT UNSIGNED,
rgt INT UNSIGNED,
// ID fields for the specific types
leafType ENUM('Branch','Area','Region'),
leafID INT UNSIGNED,
leafName VARCHAR
)
UNIQUE INDEX (leafType,leafID)
のための潜在的なアウトラインですが、上記のあなたのツリーを作成してみましょうなり、IDをマップアウトし、リレーションシップを表示名とともに保存できるようにします。
もちろん、あなたがそれぞれの間で正規化することができ、より多くのデータは、理想的には、彼らは結局、彼らは一例
としてデータのサンプルを取るすべての地理的なサブセクション
ているように、すべて効果的にデータの同じ型で、より良いをleafTypeあなたがなどを挿入する方法のためのクエリは、リンク先の記事、すなわちで見つけることができるように
id lft rgt leafType leafID
1 1 2 'Branch' 3
2 3 4 'Branch' 4
3 5 12 'Branch' 5
4 6 9 'Area' 6
5 7 8 'Region' 10
6 10 11 'Area' 2
としてテーブルに終わるかもしれない
Branch 3
Branch 4
Branch 5
Area 6
Region 10
Area 2
(http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/からそのまま引用した)
LOCK TABLE nested_category WRITE;
SELECT @myLeft := lft FROM nested_category
WHERE name = '2 WAY RADIOS';
UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myLeft;
UPDATE nested_category SET lft = lft + 2 WHERE lft > @myLeft;
INSERT INTO nested_category(name, lft, rgt) VALUES('FRS', @myLeft + 1, @myLeft + 2);
UNLOCK TABLES;
そしてSELECTは、上記2で
SELECT CONCAT(REPEAT(' ', (COUNT(parent.name) - 1)), node.name) AS name
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;
フィールド/テーブル名はもちろん変更されませんが、あなた(ソースから再び逐語的に)ツリーを説明することができます私の最新のコメント後
、必要に応じて、テーブル/フィールド名を更新することができ、下記の私は新しい行
を挿入するために使用私のストアドプロシージャの定義です
これは、その後、私は今それを読み取りを与え、あなたが知ってもらおう、次の
CALL addOptionalExtraToTree(0,'New root option','Region');
CALL addOptionalExtraToTree(4,'New child option','Area');
感謝として呼び出しを使用して呼び出されます。 – ivn
私はちょうど私の理解のごとく読んでnを持っていた、私は2つの問題を参照してください:まず、複数のテーブルにデータがあり、第二に、「エレクトロニクス」のような複数の親アイテムがあるので、子供がいるかどうかにかかわらず、すべてのアイテムをループします。 – ivn
まず、複数の親ノードを持つことができます。左右1:4のノードが1つあり、右5:6の第2ノードがある場合、SELECTは2番目のノードに子がない場合でもそれらをすべて返します。第2のポイントとして、データがすべて類似のタイプのものであることを示すツリーであるとみなしているため、効率的にこれを実行できるようにするためには、重要領域を正規化するための再構成が必要な場合があります。上記のレイアウト。 –