私は、これらのフィールド(id
、parentID
、name
、content
)を持つMySQLのページテーブルを持っています。ページの祖先のMySQLクエリ
ページの階層は次のとおりです。
- About Us - History - 2000 - 2001
私はページ「2001」によ場合はどのように私はこのページのトップレベルの祖先は「会社案内」であることを見つけるために、クエリを作成することができますか?
私は、これらのフィールド(id
、parentID
、name
、content
)を持つMySQLのページテーブルを持っています。ページの祖先のMySQLクエリ
ページの階層は次のとおりです。
- About Us - History - 2000 - 2001
私はページ「2001」によ場合はどのように私はこのページのトップレベルの祖先は「会社案内」であることを見つけるために、クエリを作成することができますか?
次のような疑似コードを使用すると、これを再帰的に行うことができます。
GetParent(current_id)
get tuple from mysql with id = current_id
If parentId = 0
Return tuple (we are at top)
Else
Return GetParent(parentId)
あなたが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';
いますが、任意の深さにネストをサポートしたい場合は、ネストされたセットがあります街で唯一の試合を試してください。時間をかけてそのページ全体を読む。あなたが期待していたよりも多分関わっているでしょうが、それがどのように機能するかを見れば非常に強力です。
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
に参加してください。
複数のレイヤーを深く移動すると、これは失敗します。これをプログラム的に行うのがベストです。 – Suroot
@Surrot Sure 'nuff。 –
私は、idは=
(ID = 5 page_table FROM PARENTIDを選択)WHERE '2001' のページの親のIDがpage_table〜5SELECT名であると仮定します
階層内の深度レベルを知っている限り、上に戻る方法を見つけるサブクエリを作成できます。
[このリンク](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
クイックコメントありがとうございます。どのクエリを使用すると、ページのIDを知っている親がわかりますか? – user520300
私はあなたが特定の答えを探していることを認識している間 - 桜は記事を選んで、全体を読んでいない。あなたが理解していない場合は、読んだ後、あなたは新しい質問を投稿したり、この質問を更新したりすることができます。しかし、それが重要であると言われているものがたくさんあり、それがなぜそれが働くのかを理解するのに役立ちます。私はこれを回答として投稿していませんでしたが、具体的にこの理由を指摘しませんでした。 – prodigitalson