sql >> Databáze >  >> RDS >> Mysql

Přesunout uzel ve stromu vnořených sad

Zde je řešení, které vám umožní přesunout uzel na jakoukoli pozici ve stromu pomocí jediného vstupního parametru – nové levé pozice (newpos) uzlu.

V zásadě existují tři sady:

  • Vytvořte nový prostor pro podstrom.
  • Přesuňte podstrom do tohoto prostoru.
  • Odstraňte staré místo uvolněné podstromem.

V psuedo-sql to vypadá takto:

//
 *  -- 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
 */

Proměnná :distance je vzdálenost mezi novou a starou pozicí, :width je velikost podstromu a :tmppos se používá ke sledování pohybu podstromu během aktualizací. Tyto proměnné jsou definovány jako:

// 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;
}

Úplný příklad kódu naleznete na mém blogu na adrese

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

Pokud se vám toto řešení líbí, hlasujte prosím.



  1. Uživatelský přístup k MySQL – specifické pro tabulku

  2. Získávání Mysql2::Error (chyba připojení SSL:ASN:špatné potvrzení jiného podpisu) v aplikaci Heroku s AWS RDS

  3. Převeďte všechny záznamy v postgresu na Titlecase, první písmeno velké

  4. SQL Server 2008 prázdný řetězec vs. prostor