2012-02-21 20 views
0

phpで複数選択ドロップダウンまたはマルチ選択チェックボックスのフォーム要素を作成する予定です。しかし、親子のメニュー項目の関係船で。親子メニュー項目で複数選択ドロップダウンを作成

例:tbl_regranionとtbl_areatobranchの3つのテーブルtbl_branch、tbl_area、tbl_regionと2つのテーブルがあります。今、私はこのようないくつかのことに見えるマルチ選択または複数のチェックボックス必要があります:あなたはそれを推測していたように

Branch 1 
Area 1 
    Region 1 
    Region 2 
Area 2 
    Region 3 
    Region 4 
    Region 7 
    Region 9 
Area 5 
Area 7 
    Region 8 

Branch 2 
Area 3 

Branch 3 
Branch 4 
Branch 5 
Area 6 
    Region 10 
Area 2 

を、支店は、ほとんどの階層の最上位であると地域は最下層すなわちです支店が親です。私はそれが子供のために見つけるまでそれをループしたいと思います。子供が見つからなくなると、配列内の次の親アイテムに移動します。

私は配列に非常に苦しんで、複雑なSQLクエリを作成しています。したがって、これを行う方法についていくつかの出発点があることを楽しみにしていました。私が本当に感謝してくれる人がいたら、私はそれを助けてくれるでしょう。事前

答えて

4

おかげで私は近くに同一のデータのツリーを設定し、上記文書で提案方法を使用して問題を作成しました

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'); 
+0

感謝として呼び出しを使用して呼び出されます。 – ivn

+0

私はちょうど私の理解のごとく読んでnを持っていた、私は2つの問題を参照してください:まず、複数のテーブルにデータがあり、第二に、「エレクトロニクス」のような複数の親アイテムがあるので、子供がいるかどうかにかかわらず、すべてのアイテムをループします。 – ivn

+0

まず、複数の親ノードを持つことができます。左右1:4のノードが1つあり、右5:6の第2ノードがある場合、SELECTは2番目のノードに子がない場合でもそれらをすべて返します。第2のポイントとして、データがすべて類似のタイプのものであることを示すツリーであるとみなしているため、効率的にこれを実行できるようにするためには、重要領域を正規化するための再構成が必要な場合があります。上記のレイアウト。 –

関連する問題