[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Многоуровневое меню
Гость_Олег
Нужно многоуровневое меню сделать, пункты берутся из мускуля. Менюшка будет типа:

Пункт1
-1.1.
-1.2
Пункт 2
-2.1
-2.2
Пункт3

Ребят, подскажите плиз, как сделать. Структура таблицы такая:

id | name | parent

У основных пунктов пэрент=0, у остальных - id родительской категории.

Сколько в нете ни шарил - не могу найти действующее решение этой проблемы, а самому дотумкать знаний не хватает blink.gif



Спустя 7 минут, 14 секунд (22.12.2009 - 21:54) VolCh написал(а):
Неэффективное, но рабочее решение:
Берём сначала все записи с parent=0, потом для каждой выбираем с parent равной её id, потом также, в общем рекурсия (хотя и можно реализовать циклом)

Эффективные - гугли nested sets и materialized path - требуют изменения структуры бд

Спустя 28 минут, 1 секунда (22.12.2009 - 22:22) sergeiss написал(а):
Я правильно понял, что ты хочешь получить выборку одним запросом сразу в нужном порядке?

Один из вариантов - изначально следить за id, чтобы они были четко в порядке возрастания. И с расчетом на возможное добавление пунктов, надо оставить пустые номера внутри.
Например, для 1-го пункта меню и всех его подпунктов можно использовать id от 1000 до 1099, для 2-го пункта от 2000 до 2099, и так далее. Промежуточные номера (в примере от 1100 до 1999) резервируем на случай, если надо будет вставить новые основные пункты меню.
При выборке будет достаточно указать order by id, чтобы все пункты были выбраны вы нужном порядке.

Другой вариант (похож на первый) - завести отдельное поле, необходимое для правильной сортировки.

Спустя 2 часа, 3 минуты, 39 секунд (23.12.2009 - 00:25) HardWoman написал(а):
Цитата
materialized path
не подходит для разноуровневых вложений.

Спустя 4 минуты, 37 секунд (23.12.2009 - 00:30) VolCh написал(а):
HardWoman, что значит разноуровневых?

Спустя 19 часов, 20 секунд (23.12.2009 - 19:30) HardWoman написал(а):
Когда для разных категорий разный уровень вложенности подкатегорий. В первой категории например 3 уровня подрубрик, а во второй 6.


Спустя 6 минут, 10 секунд (23.12.2009 - 19:37) Семён написал(а):
Цитата (Гость_Олег @ 22.12.2009 - 22:47)
Нужно многоуровневое меню сделать, пункты берутся из мускуля. Менюшка будет типа:

Пункт1
-1.1.
-1.2
Пункт 2
-2.1
-2.2
Пункт3

Ребят, подскажите плиз, как сделать. Структура таблицы такая:

id | name | parent

У основных пунктов пэрент=0, у остальных - id родительской категории.

Сколько в нете ни шарил - не могу найти действующее решение этой проблемы, а самому дотумкать знаний не хватает blink.gif

Спустя 2 часа, 49 минут, 50 секунд (23.12.2009 - 22:26) VolCh написал(а):
HardWoman и чем не подходит?
позиционное задание

1 Рубрика 1
11 Рубрика 1-1
111 Рубрика 1-1-1
1111 Рубрика 1-1-1-1
2 Рубрика 2
21 Рубрика 2-1
211 Рубрика 2-1-1
2111 Рубрика 2-1-1-1
21111 Рубрика 2-1-1-1-1
211111 Рубрика 2-1-1-1-1-1
2111111 Рубрика 2-1-1-1-1-1-1

или с разделителем

1 Рубрика 1
1.1 Рубрика 1-1
1.1.1 Рубрика 1-1-1
1.1.1.1 Рубрика 1-1-1-1
2 Рубрика 2
2.1 Рубрика 2-1
2.1.1 Рубрика 2-1-1
2.1.1.1 Рубрика 2-1-1-1
2.1.1.1.1 Рубрика 2-1-1-1-1
2.1.1.1.1.1 Рубрика 2-1-1-1-1-1
2.1.1.1.1.1.1 Рубрика 2-1-1-1-1-1-1

Два реальных ограничения, насколько я знаю:
1.Максимальная длина поля, поскольку TEXT использовать совсем не тру, то остается varchar(255)
2.Максимальное количество подрубрик (прямых детей у одного родителя) в первом варианте жестко задается на этапе проектирования.


Спустя 10 часов, 27 минут, 47 секунд (24.12.2009 - 08:54) Гость_Олег написал(а):
Вложенность будет только двухуровневая. Т.е. Родительский элемент - Дети(уже без вложенных).

И нужно по сути сделать меню, списком <ul><li></li></ul>

Так вот как запрос составить, чтоб выбирались сначала родители, проверялись на наличие детей, если есть-под каждым родителем вывести детей, и т.д.

помогите....плизз...у меня уже мосг лопается...

Спустя 17 минут, 15 секунд (24.12.2009 - 09:11) VolCh написал(а):
Так бы сразу и сказал, что двухуровневая...
SELECT `p`.`id` AS `p_id`, `p`.`name`AS `p_name`, `ch`.`id` AS `ch_id`, `ch`.`name` AS `ch_name`
FROM `table` AS `p`
LEFT JOIN `table` AS `ch` ON `p`.`id` = `ch`.`parent`
WHERE `p`.`parent` = 0

Как-то так, считываешь в массив, потом уже его разбираешь на всякие <ul>. Чтоб понятнее было - после считывания массива, сделай его дамп
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.