Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verschieben Sie den Knoten in der Baumstruktur der verschachtelten Sätze

Hier ist eine Lösung, mit der Sie einen Knoten mit nur einem einzigen Eingabeparameter an eine beliebige Position im Baum verschieben können - die neue linke Position (newpos) des Knotens.

Grundsätzlich gibt es drei Sätze:

  • Neuen Platz für den Teilbaum schaffen.
  • Verschieben Sie den Teilbaum in diesen Bereich.
  • Entfernen Sie den alten Platz, der durch den Unterbaum freigegeben wurde.

In Psuedo-SQL sieht es so aus:

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

Die Variable :distance ist der Abstand zwischen der neuen und der alten Position, die Variable :width ist die Größe des Unterbaums, und :tmppos wird verwendet, um den Überblick über den Unterbaum zu behalten, der während der Aktualisierungen verschoben wird. Diese Variablen sind wie folgt definiert:

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

Ein vollständiges Codebeispiel finden Sie in meinem Blog unter

https://rogerkeays.com/how -um-einen-knoten-in-verschachtelten-sätzen-mit-sql-zu-bewegen

Wenn Ihnen diese Lösung gefällt, stimmen Sie bitte hoch.