Mysql
 sql >> Base de données >  >> RDS >> Mysql

Déplacer le nœud dans l'arborescence des ensembles imbriqués

Voici une solution qui vous permet de déplacer un nœud vers n'importe quelle position dans l'arborescence avec un seul paramètre d'entrée :la nouvelle position à gauche (newpos) du nœud.

Fondamentalement, il existe trois ensembles :

  • Créez un nouvel espace pour la sous-arborescence.
  • Déplacez la sous-arborescence dans cet espace.
  • Supprimez l'ancien espace libéré par la sous-arborescence.

En pseudo-sql, cela ressemble à ceci :

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

La variable :distance est la distance entre la nouvelle et l'ancienne position, la :width est la taille de la sous-arborescence et :tmppos est utilisée pour garder une trace de la sous-arborescence déplacée pendant les mises à jour. Ces variables sont définies comme :

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

Pour un exemple de code complet, consultez mon blog à

https://rogerkeays.com/how -pour-déplacer-un-nœud-dans-des-ensembles-imbriqués-avec-sql

Si vous aimez cette solution, merci de voter pour.