Formelsammlung/Klasse: Nested Sets

Unicate

Erfahrenes Mitglied
Also das hier soll ein Thread werden, welcher möglichst alle Formeln zu den Nested Sets enthalten. (z.B. Node erstellen, löschen, verschieben (Level und Reihenfolge))
Ich werde dann nach und nach eine Klasse hier in das Forum posten, welche alle diese Formeln in dieser Klasse zu Methoden zusammenfasst. Es wäre toll, wenn ihr eure Verbesserungsvorschläge einbringt! Die Klasse wird in PHP4 geschrieben werden, weil:
- PHP4 auf (fast) jedem Websever vorhanden ist
- PHP5 auch PHP4 Klassen unterstützt.
Ausgangssituation:
Die Datenbankverbindung zu MySql steht.

Formeln:
Einzelner node anhand der $id, die vorhanden sein sollte:
Code:
SELECT
	lft,
	rgt,
	id,
	round((rgt - lft-1)/2,0) AS childs
FROM
	tableName
WHERE
	id  = $id;

Node hinzufügen
Vorraussetzung: Wurzelnode muss vorhanden sein
Code:
UPDATE
	tableName
SET
	lft = lft + 2
WHERE
	root_id = ELTERN_ROOTID
	AND
	lft > ELTERN_RGT
	AND 
	rgt >= ELTERN_RGT;


UPDATE 
	tableName
SET 
	rgt=rgt+2
WHERE
	root_id = ELTERN_ROOTID
	AND
	rgt >= rgt;


INSERT INTO
	tableName
	( root_id,
	  lft,rgt )
VALUES
	( ELTERN_ROOTID, 
	  ELTERN_RGT, 
	  ELTERN_RGT + 1);

Einfügen eines neuen Wurzelnodes
Code:
INSERT INTO
	tableName (root_id,lft,rgt)
VALUES
	(0, 1, 2);

#via mysql_insert_id die id holen,
#die vergeben wurde und in $id speichern

UPDATE
	tableName
SET
	root_id = $id
WHERE
	id = $id;

Man übergebe die zu löschende ID an unsere erste Formel
Alle diese gewonnen Daten schreibe ich "$variable" in Kleinbuchstaben.
Die ID, die ich löschen will schreibe ich in diesem Beispiel $ID um die Unterschiede
zu verdeutlichen und Verwechslungen auszuschliessen.
Code:
UPDATE
	tableName
SET
	lft = lft - 2
WHERE
	lft > $lft AND 
	root_id = $root_id;


UPDATE
	tableName
SET
	rgt = rgt - 2
WHERE
	rgt > $rgt AND
	root_id = $root_id;


DELETE 
FROM 
	tableName
WHERE
	id = $ID;

Falls die Childs des gelöschten nodes nicht gelöscht werden sollen,
sollten man diese mit einer späteren Formel im Level nach oben schieben
Ansonsten Childs löschen!

Code:
DELETE
FROM
	tableName
WHERE
	rgt <= $rgt AND
	lft >= $lft AND
	root_id = $root_id;


UPDATE
	tableName
SET
	rgt = rgt - ($rgt - $lft+1)
WHERE
	rgt > $rgt AND
	root_id = $root_id;

UPDATE
	tableName
SET
	lft = lft - ($rgt - $lft + 1)
WHERE
	lft > $rgt AND
	root_id = $root_id;
Gesucht:
Formel zur Berechnung des Tiefenlevels (also wie man das Level berechnet)
 
Zuletzt bearbeitet:
Zurück