Область: Разбираюсь с деревьями. Использую способ хранения типа такого: http://www.php.ru/forum/viewtopic.php?t=20735 Стратегическая задача: Переопределить родителя вершины. Тактическая задача: Отвязать вершину с поддеревом от текущего родителя. Решение: PHP: <?php $allChilds="select id from table where pid=$idChild"; $allParents="select pid from table where id=$idChild and pid<>$idChild"; $delete="delete from table where id in ($allChildsand) and pid in ($allParents)"; и все бы хорошо но: Вопрос: Как лучше обойти это ограничение? Предположения: 1) Выбирать $allChilds и $allParents во временную таблицу. Использовать ее в подзапросах. 2) PHP: <?php $allChilds="select $f from $table where $pid=$idChild"; $allParents="select $pid from $table where $f=$idChild and $pid<>$idChild"; $childs="(".implode(",",$DB->getColumn($allChilds)).")"; $parents="(".implode(",",$DB->getColumn($allParents)).")"; $delete="delete from $table where $f in $childs and $pid in $parents"; Обоим решениям не хватает... изящества что ли. Ну и не хочется мне посылать 3 запроса вместо одного...
А придется. Если бы хранил без изврата с уровнем, то делалось бы ровно 1 запросом на апдейт. TheShock'у писали, что его вариант на глубоких деревьях, да при манипуляциях крайне неудобен.
Зато он очень удобен на выборке. А без изврата с уровнем я не представляю простого способа вытащить непосредственного родителя или поддерево... Стоп... А где посмотреть (или по какому термину искать) про то же но без уровня?
Что мешает написать вот так? [sql]delete from table where id in (select id from table where pid=$idChild) and pid in (select pid from table where id=$idChild and pid<>$idChild)[/sql]
Хм., действительно не прокатывает, запрос писал без проверки на живых данных. Поверил, правда на MsSql, тоже в ошибку вывалился.
Volt(220) Без уровня у тебя просто AL, где pid надо проапдейтить у одной записи MP, кстати надо подумать, там скорее всего тоже можно одним запросом, но очень тяжелым
Simpliest Это если списком смежности хранить. А без уровня, но со всеми родителями все равно придется отвязать поддерево от всех родителей корня и привязать ко всем родителям новой вершины. UPD: Пока писал ответ уже немного поменялся. =)
В том то и дело что не просто AL, а с кучей дополнительных связей, которые без уровня слабо помогают. К MP у меня пока душа не лежит. Хотя похоже это наиболее простой вариант (надо только глянуть насколько усложняется выбор поддерева и всего дерева). Да и вопрос в общем то не в том чтобы найти лучший способ хранения, а в том чтобы разобраться с текущим...