MySQLには、標準SQLの一部である再帰クエリがありません。 PostgreSQLを含む他の多くのブランドのデータベースがこの機能をサポートしています( http: //www.postgresql.org/docs/8.4/static/queries-with.html 。
MySQLで階層データを処理するためのいくつかの手法があります。
- 最も簡単なのは、特定の写真が属する階層を示す列を追加することです。次に、同じ階層に属する写真を検索し、それらをすべてアプリケーションにフェッチして、そこで必要な写真を見つけます。これは帯域幅の点で少し無駄であり、より多くのアプリケーションコードを記述する必要があり、ツリーに多くのノードがある場合は適切ではありません。
階層データを保存してクエリを実行できるようにするための巧妙な手法もいくつかあります。
-
パスの列挙 各ノードの祖先のリストを格納します。たとえば、例の写真5には「0-2-4-5」が格納されます。 「%」で連結されたパスが
LIKE
で5のパスと一致するノードを検索することで、祖先を検索できます。 述語。 -
入れ子集合 は、JoeCelkoの記事と彼の著書「TreesandHierarchical inSQLforSmarties」で普及している複雑ですが巧妙な手法です。それについてのオンラインブログや記事もたくさんあります。ツリーのクエリは簡単ですが、直接の子または親のクエリは難しく、ノードの挿入または削除は困難です。
-
クロージャーテーブル すべての祖先/子孫の関係を個別のテーブルに格納する必要があります。 pathlength を追加すると、ツリーのクエリ、挿入と削除、および直接の親または子のクエリが簡単になります。 列。
これらの方法を比較した詳細については、私のプレゼンテーション実用的なオブジェクトをご覧ください。 -SQLの指向モデル
または私の次の本