Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день... я - web-программист... и по большому счёту в работе с mysql до сего момента использовал простейшие запросы... сейчас я пишу cms для одного из сайтов... грубо говоря меню имеет структуру по аналогии с файловой системой... так вот, таблица с меню представляет из себя следующее:
create table `tab_fs`(
`num_level` bigint not null,
`num_menu` bigint not null,
`sign` smallint not null,
`name` text not null,
`id` bigint not null,
`pid` bigint not null
);
к ней же привязана таблица с контентом:
create table `tab_content`(
`id` bigint not null,
`id_text` text not null,
.....
);
никаких ключевых полей и т.п. Если заглянуть в базу, то данные имеют, к примеру, следующий вид:
------------------------
1 | 1 | 1 | text | 1 | 1
1 | 2 | 1 | text | 2 | 1
1 | 3 | 0 | text | 3 | 1
------------------------
так вот, если мы добавляем пару подменю... то выглядят данные будут выглядить уже так:
------------------------
1 | 1 | 1 | text | 1 | 1
1 | 2 | 1 | text | 2 | 1
1 | 3 | 0 | text | 3 | 1
------------------------
2 | 1 | 1 | text | 4 | 2
2 | 2 | 0 | text | 5 | 2
2 | 3 | 1 | text | 6 | 2
------------------------
3 | 1 | 1 | text | 7 | 4
3 | 2 | 1 | text | 8 | 4
------------------------
и такой момент, если sign (признак меню, отвечающий за что это собственно есть: конечная ссылка или имеет подменю) равен 0, то в таблицу tab_content добавляется соответствующее содержимое по пункту. т.е. содержимое tab_content будет выглядить так:
--------------
3 | text | ...
5 | text | ...
--------------
так вот... собственно суть вопроса такова: если я делаю удаление раздела, то мне соответственно нужно удалить и все подразделы в него входящие и контент из второй таблицы. Как вы уже заметили, для этого существует два поля id и pid... долбить базу кучей запросов мне естесственно не хочется, а решение на php меня как-то не воодушевляет... вот я подумал что может быть в mysql можно написать один запрос... помогите пожалуйста, если кто знает как.
Неактивен
Средств для удаления по дереву в рамках одной таблицы встроенных нет. Для автоматического удаления контента из связанной таблицы можно использовать внешние ключи, см. что такое внешние ключи.
Если не хочется долбить базу запросами из PHP, то можно написать хранимую процедуру, которая будет получать в качестве аргумента id удаляемой записи и затем уже выполнять запросы. Хранимая процедура хранится в базе. Пример хранимой процедуры есть в соседней теме.
На самом деле в данном случае нет смысла оптимизировать количество запросов - такие операции выполняются редко (по сравнению с просмотром сайта). Важно здесь следить за целостностью, чтобы не было так, что поле sign=0 и есть контент или наоборот поле sign=1 и есть подменю. В вашем описании поле sign вообще говоря избыточное, так как его можно расчитать с помощью JOIN таблицы с контентом. Я бы не завазывал наличие подменю и наличие контента так жестко. Может быть следует допустить у некоторых страниц и контент и подменю.
Неактивен
Я бы не завазывал наличие подменю и наличие контента так жестко. Может быть следует допустить у некоторых страниц и контент и подменю.
вполне возможно но не в данном случае (: тут специфика меню такая...
насчёт остального... попробую... спасибо
Отредактированно creator (09.05.2008 13:41:06)
Неактивен