|
MySQL.RU - Webboard
Вернуться
рекурсивная функция для дерева (slaytor) 21/04/2011 - 17:16:38
Re: рекурсивная функция для дерева (Akina) 21/04/2011 - 18:50:25
Re: рекурсивная функция для дерева (slaytor) 21/04/2011 - 19:13:15
Re: простой запрос (Akina) 21/04/2011 - 20:32:35
> Original message text:
> From: slaytor - 21/04/2011 - 17:16:38
> Subject:рекурсивная функция для дерева
> -----------------
> Столкнулся с задачей, на мой взгляд не особо оригинальной и многие в сайтостроении пользуется подобными схемами.
>
> Нагуглить толком ничего не получилось, вот обращаюсь за помощью к местным гуру.
>
> Постараюсь как можно подробнее описать ситуацию.
>
> Есть таблица:
>
> CREATE TABLE IF NOT EXISTS docs (
> doc_id BIGINT
> UNSIGNED AUTO_INCREMENT,
> parent_id BIGINT UNSIGNED,
> friendurl TINYTEXT,
> PRIMARY KEY (doc_id)
> );
>
> Поле parent_id - ссылка на doc_id, т. е. таблица представляет из себя дерево с бесконечным уровнем вложенности.
>
> Таблица заполнена и база используется.
>
> Для начала нужно добавить уникальное поле sys_furl с типом tinytext.
>
> С этим сразу же появилась проблема, если я правильно понял, то не бывает таблиц где есть и primary key и unique полей одновременно... может и ошибаюсь..
>
> Вопрос первый:
>
> Как же правильно добавить это поле чтобы оно было уникальным и ничего не сломать?
>
> Поле sys_furl должно содержать склеенные friendurl родительских записей со своей на конце .
> Пример данных:
> doc_id = 1
> friendurl = '/catalog'
> parent_id = 0
> sys_furl = '/catalog'
>
> doc_id = 2
> friendurl = '/cpu'
> parent_id = 1
> sys_furl = '/catalog/cpu'
>
> doc_id = 3
> friendurl = '/corei7'
> parent_id = 2
> sys_furl = '/catalog/cpu/corei7'
>
> Дальше хочу создать рекурсивную функцию, которая при изменении friendurl меняет sys_furl у всех дочерних записей.
>
> Подскажите возможно ли это сделать хранимой процедурой/функцией mysql?
> Если можно, то как примерно это реализовать?
> Спасибо.
>
From: slaytor - 21/04/2011 - 19:13:15
Subject:рекурсивная функция для дерева
-----------------
> ALTER TABLE docs ADD COLUMN sys_furl TINYTEXT UNIQUE;
Пробовал в первую очередь:
#1170 - BLOB/TEXT column 'sys_furl' used in key specification without a key length
Но все получилось с varchar:
ALTER TABLE docs ADD COLUMN sys_furl varchar(255) UNIQUE;
Так и оставлю. Спасибо.
> А зачем рекурсивно? все дети ищутся одним махом по LIKE и правятся с помощью REPLACE()
Это еще лучше т.к. многие хостеры запрещают хранимые процедуры.
Но у меня не укладывается в голове как можно одним махом пройти потенциально бесконечное дерево.. к примеру если в таблице 1000 записей а меняем корневую.
Может я не правильно вопрос поставил.. нужно обойтись только запросом без вмешательства сервера приложений т.е. в моем случае чтобы php использовался только для 1 запроса.
Если же я был правильно понят и это действительно так просто, можно посмотреть пример такого запроса?
[Это сообщение - спам!]
Последние сообщения из форума
Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
38326
|
|