Willkommen im TP-Hilfe-Forum! Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst.
Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team.
nachdem ich dank der Hilfe hier im Forum die Datenbank eines Projektes auf das Nested Set-Prinzip umgestellt habe und soweit auch alles funktioniert, habe ich jetzt doch wieder ein Problem:
Und zwar sollte ich Teilbäume innerhalb des selben Levels praktisch nach rechts oder links verschieben. Wie das aussehen soll, seht ihr auf der beigefügten Grafik.
Jetzt habe ich schon auf mehreren Seite im Inet ganz gute Anleitungen gefunden (z.B. hier), aber es gelingt mir nicht, daraus die richtigen MySQL-Befehle abzuleiten.
Meine Tabelle sieht wie folgt aus:
Code:
CREATE TABLE IF NOT EXISTS `kategorien` (
`catid` int(12) unsigned NOT NULL auto_increment,
`root_id` int(11) NOT NULL,
`catname` varchar(50) NOT NULL,
`level` int(11) NOT NULL,
`lft` int(12) unsigned NOT NULL,
`rgt` int(12) unsigned NOT NULL,
PRIMARY KEY (`catid`),
KEY `lft` (`lft`),
KEY `rgt` (`rgt`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=241 ;
In der Tabelle können auch beliebig viele Wurzelknoten sein, das verschieben soll aber nur unterhalb einer Wurzel stattfinden (gleiche root_id).
Ich wäre froh, wenn mir jemand dabei helfen könnte!
um das Verschieben eines Astes inklusive seiner Kinder an eine beliebige Stelle im Baum erweitert. Die Ziel-Knoten-ID darf dabei nicht ein Kind des zu kopierenden Astes sein, aber das versteht sich ja von selbst.
Vielleicht hilft Dir das ja oder dient als Anhaltspunkt für eine Vorgehensweise.
PHP-Code:
/**
* @access public
* @param int (tree_id)
* @param int (new_parent_id)
* @param string (database table)
* @return Boolean
*
* Ast inklusive Kinder verschieben
* Move a complete tree
*/
public function move_tree($tree_id, $new_parent_id, $sql_table)
{
if($this->check_table($sql_table) === TRUE)
{
$ok=true;
if(!isset($sql) || !is_object($sql)) $sql = new MYSQL_DRIVER();
$tree=$this->get_menge($tree_id, $sql_table);
// create rootnode of brunch to get the new id
$new_id=$this->insert_link($tree[0]['name'],$new_parent_id,'nav');
$tree[0]['new_id']=$new_id;
$tree[0]['new_parent_id']=$new_parent_id;
// expend array to save new_ids
for ($i=1;$i<sizeof($tree);$i++)
{
if ($tree[$i]['parent_id']==$tree[0]['id']) $tree[$i]['new_parent_id']=$new_id;
// check if new parent id is a child of the brunch that should be moved -> thats not possible
if ($tree[$i]['id']==$new_parent_id) $ok=false;
}
if ($ok===true)
{
$itemcount=sizeof($tree);
for ($i=1;$i<$itemcount;$i++)
{
$new_id=$this->insert_link($tree[$i]['name'],$tree[$i]['new_parent_id'],'nav');
if ($new_id===false)
{
$ok=false;
break;
}
$tree[$i]['new_id']=$new_id;
// correct parent-IDs of childnodes
for ($x=1;$x<$itemcount;$x++)
{
if ($tree[$x]['parent_id']===$tree[$i]['id'])
{
$tree[$x]['new_parent_id']=$tree[$i]['new_id'];
}
}
}
}
// delete old tree
if ($ok===true)
{
$this->del_knoten($tree_id, $sql_table); // everything went fine -> delete the old brunch that now is moved
}
else $this->del_knoten($tree[0]['new_id'],$sql_table); // an error occured -> delete the copied brunch and undo changes
}
else $ok=false;
return $ok;
}
Aber gibt es vielleicht die Möglichkeit, das ganze nur per MySQL zu lösen?
Und zwar, in dem man vielleicht noch nach Richtung, in meinem Beispiel links oder rechts, unterscheidet?
Meines Wissens nach nicht. Die RGT und LFT-Werte müssen ja neu berechnet werden und zwar inklusive der bereits vorhandenen Kinder eines Astes.
Da kann ich mir keine reine MySQL-Lösung vorstellen. Du siehst ja anhand des Codes, dass die Aufgabe nicht mit 2 Queries erledigt ist.