2011-06-21 16 views
1

私は、これらのフィールド(idparentIDnamecontent)を持つMySQLのページテーブルを持っています。ページの祖先のMySQLクエリ

ページの階層は次のとおりです。

 
- About Us 
    - History 
    - 2000 
    - 2001 

私はページ「2001」によ場合はどのように私はこのページのトップレベルの祖先は「会社案内」であることを見つけるために、クエリを作成することができますか?

+0

[このリンク](http://dev.mysql.com/tech-resources/articles/hierarchical-data.html)を見てください...本質的には隣接関係リストアプローチです。 [この質問/回答](http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a-relational-database)もあなたの役に立つかもしれません。階層的なデータの格納とクエリを実行するために使用される多数のメソッドとスキーマのリストを示します。 – prodigitalson

+0

クイックコメントありがとうございます。どのクエリを使用すると、ページのIDを知っている親がわかりますか? – user520300

+1

私はあなたが特定の答えを探していることを認識している間 - 桜は記事を選んで、全体を読んでいない。あなたが理解していない場合は、読んだ後、あなたは新しい質問を投稿したり、この質問を更新したりすることができます。しかし、それが重要であると言われているものがたくさんあり、それがなぜそれが働くのかを理解するのに役立ちます。私はこれを回答として投稿していませんでしたが、具体的にこの理由を指摘しませんでした。 – prodigitalson

答えて

0

次のような疑似コードを使用すると、これを再帰的に行うことができます。

GetParent(current_id) 
    get tuple from mysql with id = current_id 
    If parentId = 0 
    Return tuple (we are at top) 
    Else 
    Return GetParent(parentId) 
1

あなたがNested Setsモデルに従うためにあなたのテーブルを再設計すると、あなただけのネストの特定のレベルを許可している場合、クエリは

「会社案内」あなたを与えるだろう

SELECT parent.name 
FROM pages AS node, 
pages AS parent 
WHERE node.lft BETWEEN parent.lft AND parent.rgt 
AND node.name = '2001' 
ORDER BY parent.lft 
LIMIT 1 

だろう、あなたは左の束を行うことができますすると、そのページに示す例のように結合します

SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4 
FROM category AS t1 
LEFT JOIN category AS t2 ON t2.parent = t1.category_id 
LEFT JOIN category AS t3 ON t3.parent = t2.category_id 
LEFT JOIN category AS t4 ON t4.parent = t3.category_id 
WHERE t4.name = 'FLASH'; 

いますが、任意の深さにネストをサポートしたい場合は、ネストされたセットがあります街で唯一の試合を試してください。時間をかけてそのページ全体を読む。あなたが期待していたよりも多分関わっているでしょうが、それがどのように機能するかを見れば非常に強力です。

0

SELECT c.id, c.name, c.content, (SELECT p.name FROM table2 as p WHERE p.id = c.parentID) AS parent FROM table1 as c;

またはparentIDに参加してください。

+0

複数のレイヤーを深く移動すると、これは失敗します。これをプログラム的に行うのがベストです。 – Suroot

+0

@Surrot Sure 'nuff。 –

0

私は、idは=

(ID = 5 page_table FROM PARENTIDを選択)WHERE '2001' のページの親のIDがpage_table〜5

SELECT名であると仮定します

階層内の深度レベルを知っている限り、上に戻る方法を見つけるサブクエリを作成できます。

関連する問題