単一のSQLクエリはありません これにより、このテーブル構造に基づいて期待どおりの順序で結果を得ることができます。
この問題を解決するには、次の2つの方法があります。
-
(DBの外部の)外部アプリケーションロジックを使用して、各カテゴリの子を検出し、アプリケーションでツリーを構築する再帰呼び出しを行います。
-
リレーショナルデータベースにツリーデータを格納するためのアルゴリズムの1つを使用します。そのようなアルゴリズムの1つは、<と呼ばれます。 code>変更されたプレオーダーツリートラバーサル または単にMPTT。
列lft
を使用すると仮定します およびrgt
トラバーサルで左/右のインデックスを維持するには、新しいカテゴリを挿入するときに、次のことを行う必要があります。
-
IDで親カテゴリ情報を取得します:
SELECT lft、rgt FROM tbl_categories WHERE categoryId =5
例として、親カテゴリにlft =7
があったと仮定します。 およびrgt=10
(この場合、すでに1人の子供がいます) -
新しいエントリ用のスペースを確保します-すべてのレコードを2シフトします(lftの場合は1、rgtの場合は1):
UPDATE tbl_categories SET rgt =rgt + 2 WHERE rgt> =10 ORDER BY rgt DESC
UPDATE tbl_categories SET lft =lft + 2 WHERE lft> =10 ORDER BY lft DESC
ここに注意してくださいORDER
降順。 lft
として およびrgt
一意であると想定される場合は、 UNIQUE
を作成することをお勧めします それらに制約を課し、重複するキーエラーを防ぐために更新の降順が必要です。
-
lft =
を設定します およびrgt=
新しいレコードを挿入します...INSERT INTO tbl_categories SET categoryName ="New Child"、parentCategoryId =5、lft =11、rgt =12、...
MPTT PHP MySQL
を検索すると、コードを使用したより詳細な例を見つけることができます。 。このテーマに関するチュートリアルはかなりあります。