|
|
|
|
|
для: Ильдар
(16.08.2008 в 19:37)
| | Ооо! Спасибо вам всем за помощь и активное обсуждение темы)) | |
|
|
|
|
|
|
|
для: elrevin
(16.08.2008 в 22:42)
| | >BinLaden предложил вариант где всеравно выполняется достаточно много запросов.
>Я уже признал что он лучше моего, но кошмар всеже остался и мое утверждение все еще в силе.
Где ж остался, когда был убран? Кошмаром я вообще-то рекурсию называл. :)
>Я только одного не понял, Вы роль судьи играете?
Скорее я играю роль разрушителя заблуждений.
>Ваш вариант решения задачи?
<?
$p = ",$id";
do
{
$p = substr($p, 1);
$res = mysql_query("SELECT id FROM tbl WHERE parent IN ($p)");
mysql_query("DELETE FROM tbl WHERE parent IN ($p)");
for($p = ''; $row = mysql_fetch_assoc($res); $p .=",".$row['id']);
} while($p);
|
Этот вариант по возможности экономит память. Число селектов и удалений в нем равно числу уровней в дереве.
Впрочем, если базу нельзя оставлять инконсистентной ни на секунду, то лучше применить вариант BinLaden (16.08.2008 в 22:25) | |
|
|
|
|
|
|
|
для: elrevin
(16.08.2008 в 22:42)
| | Trianon тут самый опытный программист. Поэтому, IMHO, лучше сначала подумать, а потом уже пытаться с ним спорить :)) | |
|
|
|
|
|
|
|
для: BinLaden
(16.08.2008 в 21:56)
| | Вот теперь - нормально. Минимум селектов, один delete . | |
|
|
|
|
|
|
|
для: Trianon
(16.08.2008 в 22:15)
| | BinLaden предложил вариант где всеравно выполняется достаточно много запросов. Я уже признал что он лучше моего, но кошмар всеже остался и мое утверждение все еще в силе. Я только одного не понял, Вы роль судьи играете? Ваш вариант решения задачи?
Извиняюсь за оффтоп. | |
|
|
|
|
|
|
|
для: Trianon
(16.08.2008 в 22:08)
| | Может быть тогда так?
<?php
$id_arr = array(1);
$trash = array();
while( !empty($id_arr) )
{
$trash = array_merge($trash, $id_arr);
$result = mysql_query("SELECT `id` FROM `tbl` WHERE `parent` IN(" . implode(', ', $id_arr) . ");");
for($id_arr = array(); $row = mysql_fetch_assoc($result); $id_arr[] = $row['id']);
}
if( !empty($trash) )
{
mysql_query("DELETE FROM `tbl` WHERE `id` IN(" . implode(', ', $trash) . ");");
}
?>
|
| |
|
|
|
|
|
|
|
для: Trianon
(16.08.2008 в 22:11)
| | :) Нет удаления несуществующих узлов.
BinLaden, предложил более лучший вариант. | |
|
|
|
|
|
|
|
для: elrevin
(16.08.2008 в 21:54)
| | >Если используемая СУБД-MySQL (и многие другие, которые не поддерживают рекурсивные запросы), то этого кошмара в данном случае не избежать.
Ничего, что BinLaden (16.08.2008 в 21:56) опроверг Ваше утверждение примером? | |
|
|
|
|
|
|
|
для: elrevin
(16.08.2008 в 21:57)
| | >можно сократить количество запросов DELETE:
> mysql_query("delete from your_table where parent=$id");
Как было по запросу на узел - так и осталось. | |
|
|
|
|
|
|
|
для: BinLaden
(16.08.2008 в 21:56)
| | Направление выбрано верно. Но селектов всё еще слишком много.... | |
|
|
|
|