Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите пожалуйста с логикой, Перебор дерева  
:(
    Опции темы
Evgen11
Дата 26.1.2013, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 9.3.2010

Репутация: нет
Всего: нет



Здравствуйте. Помогите с такой задачей, уже всю голову сломал.
Есть дерево категорий В БД.

В Виде: id | parent

Вложеность не ограничена.

Перебрать, вывести - это все сделано. 

При редактировании категории нужны 2 проверки.

1. (Она у меня сделана) Это проверить не является ли категория одновременно и своим родителем - Если да, то выводим сообщение что нельзя так..

2. Блин не как не могу допереть как сделать проверку что бы редактируемая категория не попала в любую из, в ней лежащих категориий и подкатегорий - потому что при таком раскладе вся ветка пропадёт вовсе...

Подскажите пожалуйста, а то я уже весь мозг сломал

Это сообщение отредактировал(а) Evgen11 - 26.1.2013, 22:19
PM MAIL   Вверх
Fortop
Дата 27.1.2013, 03:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Вариант 1:
У тебя любая низлежащая категория будет иметь id меньше родительской.
Вводим ограничение на каждом уровне может быть не более 10 категорий.
Тогда уровень категории определяется как степень 10
При этом каждая низлежащая категория деленая нацело на 10 должна давать номер родительской категории
Т.е. для категории 20 дочерними будут 200-209, 2000-2099, 20000-20999 и т.д.
Родительской соответственно будет категория 2.
Из минусов - при переносе категорий между ветками нужно создавать новую категорию фактически. И соответственно исправлять привязанные к категории элементы.

Вариант 2:
Не париться с формулами и вычислениями.
А тупо запросом выбирать список всех дочерних категорий и сравнивать с ним.
Плюс - при переносе категорий между ветками ничего более делать не нужно.
Минус  - запрос достаточно громоздкий особенно при неограниченной вложенности.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Evgen11
Дата 27.1.2013, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 9.3.2010

Репутация: нет
Всего: нет



Fortop, Спасибо за советы,
Интересный 1 вариант, не сразу въехал. Может где пригодится.

Второй я пробовал так делать - но просто искал более красивое решение. Вообще я на перебор категорий делаю всего 1 запрос. Создаю массив, а потом его разбираю как нужно. А при желании его можно и кэш загнать, и не тратиь даже 1 запроса. Чёт отвлёкся. Вообще сам допёр до такого (уже спать лёг) и о чюдо - свежее решение, встал включил комп и...

короче..
Я каждую ветку подкатегорий подгружаю ajax'ом. ну соответственно блокирую ту (option disabled=disabled) которую редактирую, и соответственно все ниж - лежащие тоже отпадают....

Это сообщение отредактировал(а) Evgen11 - 27.1.2013, 11:33
PM MAIL   Вверх
Aliance
Дата 28.1.2013, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 3
Всего: 137



Кстати, когда я задавался вопросом "категории в БД MySQL", то я выбрал вариант не с id <=> parent_id, а id => left <=> right, где данные представляются ввиде вложенных друг в друга шаров (ну это если визуально понимать как происходит присвоение left / right). Правда не помню уже почему выбрал именно такой способ.
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0587 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.