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

MySQLに`connectby`の代替手段はありますか?

    コメントで述べたように、mysqlには簡単な方法はありません。

    しかし!

    データベース構造を変更する可能性がある場合は、ツリーのような階層を処理するためのより優れた設計を展開できます。

    このチュートリアル をフォローしている場合 ビル・カーウィンから( こちら スライドショーのチュートリアルを参照する元の回答です)、階層構造をモデル化するために使用される4つの方法を見つけることができます:

    1. Adiacency List
    2. パスの列挙
    3. 入れ子集合
    4. クロージャーテーブル

    さて、可能な限り最良のモデルは4番目のモデルです(他の3つのモデルの説明は読者に任せます)。これには基本的に2つのテーブルが必要です。1つは要素用、もう1つはパス用です。パステーブル(クロージャテーブル自体)には、各ノードからすべての子孫(直接の子だけでなく)へのすべてのパスを格納します。

    ツリー内の直接の子のクエリが簡単になるため、各行のパスの長さも保存することをお勧めします。

    このソリューションがより多くのスペースを必要とする場合でも、全体的なパフォーマンスが最高で、非常に使いやすいです。再帰クエリにまったく依存せず、データセット全体の参照整合性を付与します。

    たとえば、ノード#4のすべての子を取得するには:

    select a.*
    from nodes a
    join paths b
    on a.node_id = b.descendant
    where b.ancestor = 4
    

    別の例:ノード#11のすべての祖先を取得する

    select a.*
    from nodes a
    join paths b
    on a.node_id = b.ancestor
    where b.descendant = 11
    

    ノード#6のサブツリーを削除する必要があります

    delete from paths where descendant in
    (select descendant from paths where ancestor = 6)
    


    1. PDOODBCを介してPHPをMSSQLに接続します

    2. MySQLの共通テーブル式

    3. SQLで月番号を月名関数に変換する

    4. sqlalchemy.orm.exc.FlushError:インスタンスにNULLIDキーがあります