sql >> Database teknologi >  >> RDS >> Mysql

Flyt node i træet Indlejrede sæt

Her er en løsning, der lader dig flytte en node til en hvilken som helst position i træet med kun en enkelt inputparameter - den nye venstre position (newpos) for noden.

Grundlæggende er der tre sæt:

  • Opret ny plads til undertræet.
  • Flyt undertræet ind i dette rum.
  • Fjern den gamle plads, der er frigivet af undertræet.

I psuedo-sql ser det sådan ud:

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

Variablen :distance er afstanden mellem den nye og gamle position, :width er størrelsen på undertræet, og :tmppos bruges til at holde styr på undertræet, der flyttes under opdateringerne. Disse variabler er defineret som:

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

For et komplet kodeeksempel, se min blog på

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

Hvis du kan lide denne løsning, bedes du stemme op.



  1. Hvordan man bruger cURL til at hente specifikke data fra et websted og derefter gemmer det i min database ved hjælp af php

  2. Hvornår anbefales det at bruge MySQL BLOB?

  3. En oversigt over klynge-til-klynge-replikering

  4. MySQL transaktion og trigger