sql >> データベース >  >> RDS >> Mysql

MySQLで階層構造を使用してデータを取得する

    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の指向モデル または私の次の本 SQL Antipatterns:データベースプログラミングの落とし穴の回避 。



    1. PostgreSQLデータベースを使用してWebアプリで完全なオフライン機能を使用するにはどうすればよいですか?

    2. このSQLステートメントをDjangoQuerySetに変換するにはどうすればよいですか?

    3. INSERT INTO...SELECTのロック動作を改善する方法

    4. mysql内の配列にimplodeを使用するwherein句