深さを制限せずに、ノードのIDに基づいて隣接リストモデルの単一のパスを取得する効果的な方法はありますか?「バナナ」という名前のノードのIDを持っている場合のように、次のパスを取得できます。食品>果物>バナナ
不可能であれば大きな問題ではありませんが、whileループなどで結合を実行できるかどうかを考えました。親が0になるまで。
深さを制限せずに、ノードのIDに基づいて隣接リストモデルの単一のパスを取得する効果的な方法はありますか?「バナナ」という名前のノードのIDを持っている場合のように、次のパスを取得できます。食品>果物>バナナ
不可能であれば大きな問題ではありませんが、whileループなどで結合を実行できるかどうかを考えました。親が0になるまで。
いいえ、少なくともMySQLではありません。これは、隣接リストモデルの最大の制限の1つです。
有限の回数だけ自己参加を続けることができますが、それは醜く、厄介で、無制限の部門をカバーしていません。また、アプリケーション内のすべてのデータをダウンロードし、ツリーを構築して、アプリケーション内のパスを見つけることもできます。
SQL Server 2005、Postgres 8.4、Oracle 11gなどの一部のDBMSは、キーワードを含む一般的なテーブル式を使用した再帰クエリをサポートしています。WITH
この機能を使用すると、このようなクエリを簡単に作成できますが、残念ながら、MySQLは再帰クエリをまだサポートしていません。
MySQLでの再帰操作をより簡単に(可能に)する代替モデル(入れ子集合モデル)について説明している次の記事を確認することをお勧めします。
さらに、 StackOverflowの定期的な寄稿者である@BillKarwinによる次のプレゼンテーションも確認することをお勧めします。
プレゼンテーションで説明されているクロージャテーブルモデルは、ネストされたセットの非常に有効な代替手段です。彼は、SQLアンチパターンの本(このトピックの章からの抜粋)でこのモデルについてさらに詳しく説明しています。
いいえ、MySQLにはPostgreSQL、Oracle、SQLServerのような再帰クエリはありません。MySQLを使用する場合、隣接リストモデルは優れたモデルではありません。ネストされたセットの方が優れています(ただし、より複雑です)。
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
このクエリを試してください:
SET @id:=12345;
SELECT content_name, content_id, (@id:=content_parent) as content_parent
FROM
( SELECT content_id, content_name, content_id, content_parent
FROM content_table
ORDER BY content_parent DESC
) AS aux_table
WHERE content_id = @id