sql >> Database >  >> RDS >> Mysql

Verplaats knoop in geneste sets boom

Hier is een oplossing waarmee u een knooppunt naar elke positie in de boomstructuur kunt verplaatsen met slechts een enkele invoerparameter - de nieuwe linkerpositie (newpos) van het knooppunt.

In wezen zijn er drie sets:

  • Maak een nieuwe ruimte voor de substructuur.
  • Verplaats de substructuur naar deze ruimte.
  • Verwijder de oude ruimte die door de substructuur is vrijgemaakt.

In psuedo-sql ziet het er als volgt uit:

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

De variabele :distance is de afstand tussen de nieuwe en oude posities, de :width is de grootte van de substructuur en :tmppos wordt gebruikt om bij te houden welke substructuur wordt verplaatst tijdens de updates. Deze variabelen zijn gedefinieerd als:

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

Voor een compleet codevoorbeeld, zie mijn blog op

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

Als je deze oplossing leuk vindt, stem dan alsjeblieft.



  1. Het datamodel voor belangrijke data

  2. Tool voor het scripten van tabelgegevens

  3. Hoe verander ik db-schema in dbo

  4. Implementeer MySQL relationele databases op Ubuntu 12.04 (Precieze Pangolin)