質問
テーブル構造
id | message | reply_id
1 | help me! | 0
434 | love to | 1
852 | didn't work | 434
0110 | try this | 852
2200 | this wont | 0
5465 | done. :) | 0110
いid"852"の中のツリーメニューが用していただきたいと思い全ての関連及び次に関連行していきたいなと思っています下記の結果ようになります:
あります。>愛>なかった作品>う>行われます。:)(この結果を示したphpループが始まりプからスターター idの1の回答のidが0になります。
注意:2200idならないので、その一部ではありません。
解決
が代替案のための階層的な情報をすアプリケーション:
共通のテーブル表現 (当たり、SQL-2003年基準)の支援を再帰的なSQLクエリに対する親-idタイプのデータだけます。これまでに、MySQLはこの特徴です。PostgreSQL8.4、Microsoft SQL Server、IBM DB2の例RDBMSのブランドを支える熱膨張syntax.Oracleまたは独自の拡張をSQL構文を支援する再帰的ます。
入れ子のセット (左右の解決@phantombrainつ)シングソリューションの詳細なジョー Celkoの"木の階層アプリケーションのためのSmartiesでも多くの記事やブログの投稿のインターネット。
パスの列挙 (通称を実現Path)店舗の文字列の各行の階層のパスの先祖のことです。せること
LIKE
クエリと比較するのpath文字列をその祖先は、ひとつの枠に閉じこもや子孫'った。閉鎖のテーブル (通称他閉鎖関係)第二のテーブルの全ての先祖-子孫の関係だけでなく、すぐ上の親としてのデザインだけます。多くの種類のクエリーなくまのパスに格納されています。
ハイブリッド解 も存在している。例えば、店舗のすぐ上の親のidとしてやっているものです。今ることができるその他の列と同じ階層のフェッチしたアプリケーションコードし、選別のツリーは、従来のデータ構造です。
他のヒント
これらは、フォーラムなどのメニュー項目ではなく、非常にダイナミックな何か、あると仮定すると、私は、各項目の左と右の値を追加するには、スキーマの変更をお勧めします。左と右の値の間のIDを使用して、クエリを実行しているノードのすべての子です。したがって、それはサブアイテムを取得するには1つの左/右の値を取得するクエリ、および2番目のクエリを実行するのは簡単です。
http://www.sitepoint.com/print/hierarchical-dataを参照してください。 -database / の詳細については、
再帰が、これを行うための最もエレガントな方法ですが、私は、MySQLは、カスタム関数やstoredproceduresでそれをサポートしていないと思います。私は、テーブルを結合し、バックの結果を照会し、その後、自分のIDを取得するために一時テーブルまたはテーブル変数にループを示唆しています。私は、これはテストされていないので、非常によくMySQLを知っているが、この効果に何かありません。
CREATE TEMPORARY TABLE tbl (myid int, ViewOrder int);
Set @ifoundID=IdYourLookingFor;
Set @iStartID=@ifoundID;
Set @iOrder=0;
INSERT INTO tbl(myid,ViewOrder)VALUES(@ifoundID,@iOrder);
BEGIN --get the ones going up
WHILE (@ifoundID Is Not Null) DO
SELECT @ifoundID=reply_id FROM YourTable WHERE id=@ifoundID; --find the next id
SET @iOrder1=@iOrder-1; --increment the order
INSERT INTO tbl(myid,ViewOrder)VALUES(@ifoundID,@iOrder);--save the nextid
END WHILE;
END
Set @ifoundID=@iStartID;
BEGIN --get the ones going down
WHILE (@ifoundID Is Not Null) DO
SELECT @ifoundID=id FROM YourTable WHERE reply_id=@ifoundID; --find the next id
SET @iOrder1=@iOrder+1; --increment the order
INSERT INTO tbl(myid,ViewOrder)VALUES(@ifoundID,@iOrder);--save the nextid
END WHILE;
END
SELECT * FROM tbl INNER JOIN YourTable ON tbl.myid=YourTable.id ORDER BY ViewOrder
助け希望