Множественный update дерева

ExOLiNe
Дата: 14.02.2013 09:44:27
Здравствуйте. Имеется таблица `categories` с полями(наиболее важные):
cat_id - автоинкремент-идентификатор
cat_parent - идентификатор родительской категории
del - пометка на удаление(0 - категория существует, 1 - помечена как удаленная)

Имеется админпанель, в которой все категории и подкатегории разной вложенности выводятся в виде дерева. Напротив каждой категории есть кнопочка DEL, которая помечает категорию как удаленную.
Проблема в том, что я могу создать update-запрос, помечающий саму категорию и прямые дочерние подкатегории. Не могли бы вы помочь составить данный запрос?)
Примечания: никаких дополнительных таблиц, имеющих информацию об узлах нету. Читал этот форум, но к сожалению там везде либо ограниченная вложенность либо дополнительные таблицы :(
Если все же такие темы имеют место быть на этом форуме, прошу прощения, направьте меня, пожалуйста, куда нужно)
Akina
Дата: 14.02.2013 10:02:06
google => "nested set"
ExOLiNe
Дата: 14.02.2013 10:36:32
То есть моей структурой таблицы никак не обойтись чтоли? Кстати поле cat_level есть) я просто думал что оно для составления запроса не нужно будет..
Akina
Дата: 14.02.2013 10:49:39
ExOLiNe
То есть моей структурой таблицы никак не обойтись чтоли?
В рамках запроса при неограниченной (теоретически) вложенности? конечно, нет - MySQL не знает ни про СТЕ, ни про рекурсивные запросы...
Однако задача вполне решаема через хранимую процедуру.
ExOLiNe
Дата: 14.02.2013 10:56:23
Akina
Однако задача вполне решаема через хранимую процедуру.

Каким образом? Код можно?
Akina
Дата: 14.02.2013 11:10:14
ExOLiNe
Akina
Однако задача вполне решаема через хранимую процедуру.

Каким образом?

http://dev.mysql.com/doc/refman/5.5/en/stored-routines-syntax.html
Recursion in stored procedures is permitted but disabled by default. To enable recursion, set the max_sp_recursion_depth server system variable to a value greater than zero. Stored procedure recursion increases the demand on thread stack space. If you increase the value of max_sp_recursion_depth, it may be necessary to increase thread stack size by increasing the value of thread_stack at server startup.

Пишешь рекурсивную процедуру. Формируешь курсор по входящим данным (ИД текущего узла), выбирающий все его подузлы. Для каждого подузла - помечаешь его к удалению, после чего вызываешь рекурсивно ту же процедуру, передавая ей этот подузел в качестве текущего, по окончании обработки всех подузлов выходишь из процедуры... всё собсно.
Только не забудь настроить сервер соответственно, чтобы ему ресов хватило.
DBConstructor
Дата: 14.02.2013 12:31:50
Akina, только не хранимую процедуру, а триггер.
Akina
Дата: 14.02.2013 13:01:53
DBConstructor
Akina, только не хранимую процедуру, а триггер.

Нет, именно процедуру. В триггере нельзя апдейтить таблицу, изменение которой вызвало срабатывание триггера.
tanglir
Дата: 14.02.2013 13:06:44
DBConstructor
Akina, только не хранимую процедуру, а триггер.
Akina
при неограниченной (теоретически) вложенности?
Akina
Дата: 14.02.2013 13:12:12
tanglir, реально при высоком уровне вложенности придётся делать псевдорекурсию (ибо никакого стека не хватит) - но для уровня вложенности порядка двух сотен я видел вполне рабочую (и реально работавшую) рекурсивную реализацию.