id | pid | name
1 | 0 | root
2 | 1 | Раздел 1
3 | 1 | Раздел 2
4 | 1 | Раздел 3
5 | 2 | Подраздел 1.1
6 | 2 | Подраздел 1.2
7 | 2 | Подраздел 1.3
8 | 3 | Подраздел 2.1
9 | 3 | Подраздел 2.2
10 | 3 | Подраздел 2.3
11 | 9 | Подраздел 2.2.1
12 | 9 | Подраздел 2.2.2
Но как правильно создать запрос для удаления например раздела "1" соответственно с подразделами или удалить Подраздел 2.2 с подразделами?

Спустя 28 минут, 10 секунд (30.08.2007 - 10:35) Ghost написал(а):
в один запрос никак. вот за что я люблю postgres и внешние ключи с каскадным обновлением

Спустя 10 минут, 42 секунды (30.08.2007 - 10:45) Igor написал(а):
Цитата(Ghost @ 30.8.2007, 7:35) [snapback]26554[/snapback]
в один запрос никак. вот за что я люблю postgres и внешние ключи с каскадным обновлением 

Ну мож в два-три запроса, а то у меня на эту операцию в голову приходит 2МВ текста!

Спустя 7 минут, 56 секунд (30.08.2007 - 10:53) vasa_c написал(а):
function удалить_раздел(номер)
{
выбрать вложенные подразделы
для каждого подраздела в цикле рекурсивно удалить_раздел(подраздел)
удалить запись для раздела
}
{
выбрать вложенные подразделы
для каждого подраздела в цикле рекурсивно удалить_раздел(подраздел)
удалить запись для раздела
}
Спустя 5 часов, 2 минуты, 42 секунды (30.08.2007 - 15:56) Igor написал(а):
Цитата(vasa_c @ 30.8.2007, 7:53) [snapback]26556[/snapback]
function удалить_раздел(номер)
{
выбрать вложенные подразделы
для каждого подраздела в цикле рекурсивно удалить_раздел(подраздел)
удалить запись для раздела
}
{
выбрать вложенные подразделы
для каждого подраздела в цикле рекурсивно удалить_раздел(подраздел)
удалить запись для раздела
}
A что значит "рекурсивно"?

Спустя 42 минуты, 5 секунд (30.08.2007 - 16:38) md5 написал(а):
Спустя 15 часов, 45 минут, 25 секунд (31.08.2007 - 08:24) Igor написал(а):
Цитата(md5 @ 30.8.2007, 13:38) [snapback]26588[/snapback]
Cпасибо за ссылку!
но как это замутить? Вот что написал:
Код
//выбрать отмеченые разделы
$delmenu0 = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `site` WHERE `del` = '1' ORDER BY `ud`";
$result0 = mysql_query($delmenu0);
while ( $row0 = mysql_fetch_array($result0) )
{
echo"выбрать отмеченые разделы ".$row0['id']."<br>";
//*******----------*********
$delmenu = "SELECT `id`, `name`, `ud`, `pid` FROM `site` WHERE `pid` = '".$row0['id']."' ORDER BY `ud`";
$result = mysql_query($delmenu); // узнали pid раздела по id
while ( $row = mysql_fetch_array($result) )
{
echo"узнали pid раздела по id = ".$row['pid']."<br>";
$delmenu1 = "SELECT `id`, `name`, `ud`, `pid` FROM `site` WHERE `pid` = '".$row['id']."' ORDER BY `ud`";
$result1 = mysql_query($delmenu1); // узнали id раздела по pid
while ( $row1 = mysql_fetch_array($result1) )
{
echo"узнали id раздела по pid = ".$row1['id']."<br>";
}
}
}
$delmenu0 = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `site` WHERE `del` = '1' ORDER BY `ud`";
$result0 = mysql_query($delmenu0);
while ( $row0 = mysql_fetch_array($result0) )
{
echo"выбрать отмеченые разделы ".$row0['id']."<br>";
//*******----------*********
$delmenu = "SELECT `id`, `name`, `ud`, `pid` FROM `site` WHERE `pid` = '".$row0['id']."' ORDER BY `ud`";
$result = mysql_query($delmenu); // узнали pid раздела по id
while ( $row = mysql_fetch_array($result) )
{
echo"узнали pid раздела по id = ".$row['pid']."<br>";
$delmenu1 = "SELECT `id`, `name`, `ud`, `pid` FROM `site` WHERE `pid` = '".$row['id']."' ORDER BY `ud`";
$result1 = mysql_query($delmenu1); // узнали id раздела по pid
while ( $row1 = mysql_fetch_array($result1) )
{
echo"узнали id раздела по pid = ".$row1['id']."<br>";
}
}
}
Но как это РЕКУРСИВНО замутить?

И Ваще такое меню это нормально? так кто-нибудь делал?
Спустя 22 минуты, 5 секунд (31.08.2007 - 08:46) md5 написал(а):
удаление child'ов по предку надо вынести в функцию!
function удаление_по_предку($id_предка)
{
запрос вида: SELECT ... WHERE `parent_id`=$id_предка;
while ($row = fetch)
{
запрос вида: SELECT ... WHERE `parent_id`=$row['id'];
if (mysql_num_rows() > 1)
{
удаление_по_предку($row['id']);
}
запрос вида: DELETE ... WHERE `id`=$row['id'];
}
}
это тебе общая логика
function удаление_по_предку($id_предка)
{
запрос вида: SELECT ... WHERE `parent_id`=$id_предка;
while ($row = fetch)
{
запрос вида: SELECT ... WHERE `parent_id`=$row['id'];
if (mysql_num_rows() > 1)
{
удаление_по_предку($row['id']);
}
запрос вида: DELETE ... WHERE `id`=$row['id'];
}
}
это тебе общая логика
Спустя 4 минуты, 28 секунд (31.08.2007 - 08:50) Igor написал(а):
Цитата(md5 @ 31.8.2007, 5:46) [snapback]26605[/snapback]
удаление child'ов по предку надо вынести в функцию!
function удаление_по_предку($id_предка)
{
запрос вида: SELECT ... WHERE `parent_id`=$id_предка;
while ($row = fetch)
{
запрос вида: SELECT ... WHERE `parent_id`=$row['id'];
if (mysql_num_rows() > 1)
{
удаление_по_предку($row['id']);
}
запрос вида: DELETE ... WHERE `id`=$row['id'];
}
}
это тебе общая логика
function удаление_по_предку($id_предка)
{
запрос вида: SELECT ... WHERE `parent_id`=$id_предка;
while ($row = fetch)
{
запрос вида: SELECT ... WHERE `parent_id`=$row['id'];
if (mysql_num_rows() > 1)
{
удаление_по_предку($row['id']);
}
запрос вида: DELETE ... WHERE `id`=$row['id'];
}
}
это тебе общая логика
Спасибо! Буду пробовать!

Спустя 5 часов, 27 минут, 29 секунд (31.08.2007 - 14:18) Igor написал(а):


// удаление child'ов по предку надо вынести в функцию!
function del_predok()
{
$query = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `site` WHERE `pid`='3'";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result))
{
$query1 = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `site` WHERE `pid`='".$row['id']."'";
$result1 = mysql_query($query1);
if (mysql_num_rows($result1) > 1)
{
del_predok($row['id']);
}
$query3 = "UPDATE `site` SET `del`= '1' WHERE `id` = '".$row['id']."'";
$result3 = mysql_query($query3);
}
}
del_predok('3');
Вот ссылка на описание дерева с SQL и JavaScript и с дистрибутивом для скачивания! Мож это прояснит ситуацию... Думаю многим интересно будет.
http://www.activex.net.ru/docs/phpdtree.shtml
Спустя 29 минут, 29 секунд (31.08.2007 - 14:47) md5 написал(а):
Igor, аааааааааааааааааааааааааааа
Код
function del_by_papa($papa_id)
{
$query = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `site` WHERE `pid`='{$papa_id}'";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result))
{
$query1 = "SELECT `id` WHERE `pid`='".$row['id']."' LIMIT 1";
$result1 = mysql_query($query1);
if (mysql_num_rows($result1) == 1)
{
del_by_papa($row['id']);
}
$query3 = "UPDATE `site` SET `del`= '1' WHERE `id` = '".$row['id']."'";
$result3 = mysql_query($query3);
}
}
{
$query = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `site` WHERE `pid`='{$papa_id}'";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result))
{
$query1 = "SELECT `id` WHERE `pid`='".$row['id']."' LIMIT 1";
$result1 = mysql_query($query1);
if (mysql_num_rows($result1) == 1)
{
del_by_papa($row['id']);
}
$query3 = "UPDATE `site` SET `del`= '1' WHERE `id` = '".$row['id']."'";
$result3 = mysql_query($query3);
}
}
Спустя 3 минуты, 45 секунд (31.08.2007 - 14:51) Igor написал(а):
Цитата(md5 @ 31.8.2007, 11:47) [snapback]26621[/snapback]
Igor, аааааааааааааааааааааааааааа
Код
function del_by_papa($papa_id)
{
$query = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `site` WHERE `pid`='{$papa_id}'";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result))
{
$query1 = "SELECT `id` WHERE `pid`='".$row['id']."' LIMIT 1";
$result1 = mysql_query($query1);
if (mysql_num_rows($result1) == 1)
{
del_by_papa($row['id']);
}
$query3 = "UPDATE `site` SET `del`= '1' WHERE `id` = '".$row['id']."'";
$result3 = mysql_query($query3);
}
}
{
$query = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `site` WHERE `pid`='{$papa_id}'";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result))
{
$query1 = "SELECT `id` WHERE `pid`='".$row['id']."' LIMIT 1";
$result1 = mysql_query($query1);
if (mysql_num_rows($result1) == 1)
{
del_by_papa($row['id']);
}
$query3 = "UPDATE `site` SET `del`= '1' WHERE `id` = '".$row['id']."'";
$result3 = mysql_query($query3);
}
}
md5! Я в Функциях не шарю. (только учусь) Вот:
Fatal error: Cannot redeclare del_by_papa() (previously declared in c:\...\_scr\proc.php:27)
Спустя 1 минута, 56 секунд (31.08.2007 - 14:53) md5 написал(а):
ты зачем 2 раза функцию объявляешь?
Спустя 4 минуты, 51 секунда (31.08.2007 - 14:58) Igor написал(а):
Ща пишет Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource
И вносит значение "del" в первый и второй уровень дерева а остальные не вносит...
Я правильно делаю?
И вносит значение "del" в первый и второй уровень дерева а остальные не вносит...
Я правильно делаю?
Код
function del_by_papa()
{
$papa_id=1;
$query = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `site` WHERE `pid`='{$papa_id}'";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result))
{
$query1 = "SELECT `id` WHERE `pid`='".$row['id']."' LIMIT 1";
$result1 = mysql_query($query1);
if (mysql_num_rows($result1) == 1)
{
del_by_papa($row['id']);
}
$query3 = "UPDATE `site` SET `del`= '1' WHERE `id` = '".$row['id']."'";
$result3 = mysql_query($query3);
}
}
del_by_papa($papa_id);
{
$papa_id=1;
$query = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `site` WHERE `pid`='{$papa_id}'";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result))
{
$query1 = "SELECT `id` WHERE `pid`='".$row['id']."' LIMIT 1";
$result1 = mysql_query($query1);
if (mysql_num_rows($result1) == 1)
{
del_by_papa($row['id']);
}
$query3 = "UPDATE `site` SET `del`= '1' WHERE `id` = '".$row['id']."'";
$result3 = mysql_query($query3);
}
}
del_by_papa($papa_id);
Спустя 40 минут, 1 секунда (31.08.2007 - 15:38) md5 написал(а):
везде смотри вывод ошибок
or die mysql_error()
or die mysql_error()
Спустя 1 час, 8 минут, 45 секунд (31.08.2007 - 16:46) Ghost написал(а):
Цитата
md5! Я в Функциях не шарю. (только учусь)
блин, судя по дате регистрации ты с марта учишься.. хм и до сих пор "нешаришь в ф-циях"
в ман трудно посмотреть??
Спустя 1 день, 22 часа, 59 минут, 13 секунд (3.09.2007 - 15:46) Igor написал(а):
MD5! Cпасибо ОГРОМНОЕ!!!
Всё работает!
Vasa_c! теперь понятно что ты написал! Спасибо!
и всем Спасибо!

Всё работает!
Vasa_c! теперь понятно что ты написал! Спасибо!

и всем Спасибо!
Код
function del_by_papa($papa_id)
{
$query = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `tab` WHERE `pid`='{$papa_id}'";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result))
{
$query1 = "SELECT `id`, `pid` FROM `tab` WHERE `pid`='".$row['id']."' LIMIT 1";
$result1 = mysql_query($query1);
if (mysql_num_rows($result1) == 1)
{
del_by_papa($row['id']);
}
$query3 = "UPDATE `tab` SET `del`= '1' WHERE `id` = '".$row['id']."'";
$result3 = mysql_query($query3);
}
}
del_by_papa();
{
$query = "SELECT `id`, `name`, `ud`, `pid`, `del` FROM `tab` WHERE `pid`='{$papa_id}'";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result))
{
$query1 = "SELECT `id`, `pid` FROM `tab` WHERE `pid`='".$row['id']."' LIMIT 1";
$result1 = mysql_query($query1);
if (mysql_num_rows($result1) == 1)
{
del_by_papa($row['id']);
}
$query3 = "UPDATE `tab` SET `del`= '1' WHERE `id` = '".$row['id']."'";
$result3 = mysql_query($query3);
}
}
del_by_papa();
Спустя 1 час, 24 минуты, 5 секунд (3.09.2007 - 17:10) md5 написал(а):
ага, только вызывая функцию надо первоначальный id передать
_____________