例:
/ company /セクションのニュースリストにアクセスする必要があります(item1、item2)
- /会社/会社について
- /会社/ニュース/ニュース
- /会社/ニュース/ item2 / 2番目のニュース
- /会社/ニュース/ item1 /最初のニュース
- /会社/歴史/歴史
- /会社/連絡先/連絡先
- /会社/ニュース/ニュース
データは、次の構造を持つテーブルに保存されます。
パス - パスを持つツリー
id
parent_id # id (paths.id)
name # ,
path # (/company/, /company/news/item1/)
title #
path_have_childs-リンクテーブル。親ノードに相対的なレベルの子ノードのリストを格納します
parent_id # id (paths.id)
child_id # id (paths.id)
level #
データ-パスを持つテーブル:
id | parent_id | お名前 | 道 | タイトル |
---|---|---|---|---|
1 | 0 | / | ホーム | |
2 | 1 | 会社 | /会社/ | 会社について |
4 | 2 | ニュース | /会社/ニュース/ | ニュース |
5 | 4 | item1 | /会社/ニュース/ item1 / | ニュース1 |
6 | 4 | item2 | /会社/ニュース/ item2 / | ニュース2 |
3 | 1 | カタログ | /カタログ/ | カタログ |
7 | 3 | category1 | /カタログ/ category1 / | カテゴリー1 |
8 | 7 | category2 | /カタログ/ category1 / category2 / | カテゴリー2 |
追加テーブル-親に対する子ノードのレベルのストレージ:
parent_id | child_id | レベル |
---|---|---|
1 | 2 | 1 |
1 | 8 | 3 |
1 | 7 | 2 |
1 | 6 | 3 |
1 | 5 | 3 |
1 | 4 | 2 |
1 | 3 | 1 |
2 | 5 | 2 |
2 | 6 | 2 |
2 | 4 | 1 |
3 | 7 | 1 |
3 | 8 | 2 |
4 | 6 | 1 |
4 | 5 | 1 |
7 | 8 | 1 |
レベルの追加テーブルを生成するクエリ-各ノードについて、直接の子ノード以外のすべての子ノードが検出され、現在のノードに相対的なネストレベルが計算されます。
INSERT INTO path_have_childs
SELECT
P.id AS parent_id,
C.id AS child_id,
(LENGTH(C. path ) - LENGTH(REPLACE(C. path , '/' , '' )))
- (LENGTH(P. path ) - LENGTH(REPLACE(P. path , '/' , '' )))
FROM paths AS P
INNER JOIN paths AS C ON (C. path LIKE CONCAT(P. path , '_%' ))
レベルY(parent_have_childs.level)のノードX(parent_have_childs.parent_id)のすべての子ノードを選択します。
SELECT C. path
FROM path_have_childs AS PHC
INNER JOIN paths AS C ON (PHC.child_id = C.id)
WHERE
PHC. level = Y
AND PHC.parent_id = X
建設的なコメントと批判を歓迎します...