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

入れ子集合ツリーでノードを移動

    これは、単一の入力パラメータ(ノードの新しい左位置(newpos))だけでノードをツリー内の任意の位置に移動できるソリューションです。

    基本的に3つのセットがあります:

    • サブツリー用の新しいスペースを作成します。
    • サブツリーをこのスペースに移動します。
    • サブツリーによって空いた古いスペースを削除します。

    psuedo-sqlでは、次のようになります。

    //
     *  -- create new space for subtree
     *  UPDATE tags SET lpos = lpos + :width WHERE lpos >= :newpos
     *  UPDATE tags SET rpos = rpos + :width WHERE rpos >= :newpos
     * 
     *  -- move subtree into new space
     *  UPDATE tags SET lpos = lpos + :distance, rpos = rpos + :distance
     *           WHERE lpos >= :tmppos AND rpos < :tmppos + :width
     * 
     *  -- remove old space vacated by subtree
     *  UPDATE tags SET lpos = lpos - :width WHERE lpos > :oldrpos
     *  UPDATE tags SET rpos = rpos - :width WHERE rpos > :oldrpos
     */
    

    :distance変数は新しい位置と古い位置の間の距離であり、:widthはサブツリーのサイズであり、:tmpposは更新中に移動されるサブツリーを追跡するために使用されます。これらの変数は次のように定義されます:

    // calculate position adjustment variables
    int width = node.getRpos() - node.getLpos() + 1;
    int distance = newpos - node.getLpos();
    int tmppos = node.getLpos();
            
    // backwards movement must account for new space
    if (distance < 0) {
        distance -= width;
        tmppos += width;
    }
    

    完全なコード例については、私のブログを参照してください

    https://rogerkeays.com/how -to-move-a-node-in-nested-sets-with-sql

    このソリューションが気に入った場合は、賛成票を投じてください。



    1. Rails4で生のSQLをサニタイズする方法

    2. 複数の列にわたるDISTINCTのカウント

    3. ゼロより大きいansがNULLではない最小値を取得するためのクエリ

    4. mysqlの日付行に30日を追加したい