Удаление категории (структура с parent_dir)

1. KOZZ (13.04.2011 / 07:56)
Давно мучает вопрос.
Допустим, скрипт библиотеки.
категории и статьи пишем 2 разные таблицы.
примерно такие таблицы получаются:
Категории:
create table if not exists `library_category` (
`id` int auto_increment, - ид категории
`name` text not null, - название 
`parent` int not null, - "родительская" категория
primary key(id)
) engine=myisam default charset=utf8;

Статьи:
create table if not exists `library_article` (
`id` int auto_increment, - ид статьи
`name` text not null, - название статьи
`text` text, - содержание статьи
`parent` int not null, - "родительская" категория
primary key(id)
) engine=myisam default charset=utf8;
Задача: удалить категорию со всеми вложенными статьями и категориями
Если удалять категории и статьи только с id удаляемой категории, то мы не удалим все вложения.
У меня есть решение, но оно очень коряво выглядит, хотелось бы посмотреть на ваши варианты решения

2. Богдан (13.04.2011 / 10:24)
Используй структуру Nested Sets. Тогда не будет такой проблемы. Удалишь все вложенное одним запросом

3. KOZZ (13.04.2011 / 10:35)
2. G_A_N_J_A_R, хм, спасибо, почитаю smile наткнулся еще на несколько хороших статей про другие виды структур, читаю klass +1
Однако вопрос пока не снимаю

4. KOZZ (01.06.2011 / 06:06)
в общем, так и не нашел нормального решения, все еще готов учиться у знающих людей smile
передавайте опыт молодежи E

Добавлено через 01:26 сек.
как - то случайно напоролся на некое каскадное удаление, но там тип таблицы не myisam , а innodb (т.к. foreign key не существуют в myisam), менять тип не хотелось бы. да и там как - то все не очень доступно было написано, недопонял

5. Женек (01.06.2011 / 12:31)
1. eGo, я двумя запросами бил, тоже искал так и не нашел решения нормального. У меня тем более все сложнее было... Сервером базы данных был Postgres D убивал двумя запросами, первый с таблицы детей, второй бил родителя

6. KOZZ (02.06.2011 / 06:36)
не не, речь немного о другом.
то есть нужно найти всех детей как - то рекурсивно при такой структуре.
а насколько я понимаю это можно сделать только очень емким циклом с mysql запросами, что само по себе далеко не хорошо.

7. Станислав (02.06.2011 / 06:59)
Так всё просто же, если это то, что я понял:

Первый запрос: выдёргиваем все статьи с id-ом категории, ну, собственно, удаляем их.
Второй запрос: удаляем категорию.

Добавлено через 05:46 сек.
$id = $_GET['id'];
$sql_one = mysql_query("DELETE FROM library_article WHERE parent = ".$id."");
$sql_two = mysql_query("DELETE FROM library_category WHERE id = ".$id."");
$sql_three = mysql_query("DELETE FROM library_category WHERE parent = ".$id."");
Как-то так, ога? =)

Добавлено через 09:07 сек.
Хотя, это если категории до второго уровня доходят...
Тебе, как я УЖЕ понял, надо для бесконечного числа подкатегорий?

8. Станислав (02.06.2011 / 07:19)
В общем, у меня такая штука была, когда я года 2 назад двиг писал. Там на форуме такое дело было =) Сейчас, если найду, то напишу =)

9. KOZZ (02.06.2011 / 09:36)
7. SNELS, вся соль в том, что категории то могут быть и 5, и 10 уровня.
другими словами нужно удаление категорий произвольной вложенности.

10. Станислав (02.06.2011 / 10:05)
9. eGo, адский цикл придётся делать, пожалуй =)
По-другому, думаю, не получится тут.

11. KOZZ (02.06.2011 / 10:11)
10. SNELS, ну вот я тоже так думаю, и другого решения не вижу.
поэтому и спрашиваю, вдруг кто делает иначе как - то.

URL: https://visavi.net/topics/20677