[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как правильно организовать выборку меню из базы
averardo
Не буду скидывать скрипт. Расскажу как есть. Есть таблица с меню. В таблице есть пункт "подменю". В этот пункт я прописываю id основного пункта меню. Корневой пункт меню это 0. Вот пример:
id = 1 | name = "name" | submenu = 0
id = 2 | name = "name" | submenu = 0
id = 3 | name = "name" | submenu = 1
id = 4 | name = "name" | submenu = 1
id = 5 | name = "name" | submenu = 2

Как я делаю выборку из базы. Написал функцию проверяющую есть ли подменю для определенного меню, например для меню с id = 1 и если есть то рекурсивно вызываю функцию которую опишу далее.
Основная функция выводит меню из базы через цикл и вызывает функцию описанную ранее после каждого прохода цикла.
Примерный ход событий: Выводит первый пункт меню и тут же проверяет есть ли подменю для данного меню. Если есть, то рекурсивно вызывает вторую функцию. Далее выводит вторую запись из меню и проделывает тоже самое.
В итоге получается что запросов не сосчитать. Ну давайте посчитаем запросы с примера выше:
1. Запрос выводит первую запись.
2. Проверяет нет ли у нее подпунктов.
3-6. Подпункты найдены и функция выводит эти подпункты, параллельно проверяя нет ли в этих подпунктах своих подпунктов. Тут будет 4 запроса в базу.
7-10. Проделывает что и в первом случае только для этого пункта меню.
В итоге примерно 10 запросов для всего лиш 5 пунктов меню. Если их будет скажем 10-15. Это уже очень много запросов.
---
Для тех кто не понял или не захотел читать описание сразу вопрос:
Как можно организовать вывод данных из базы данных и по мере нахождения подпункта выводить его.
sergeiss
Для того, чтобы не делать лишних запросов, надо правильно организовать один запрос.

Но сначала ответь на один вопрос. База данных у тебя, как я понимаю, "дефолт БД", да? wink.gif

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
MailRes
У меня день ушел, пока додумался как выстроить цепочку менюшки))
Сначала определил скриптом IDшку открытого пункта меню, а потом циклом перебирал "родителей", записывал в массив и тогда получилась цепочка от начального пункта до конечного.

Знатоки меня поправят, но попробуй сделать так: с помощью $_GET получи IDшку открытого пункта меню, а затем циклом while ( submenu <> 0 ) строй цепочку от конечного до начального.
sergeiss
На самом деле, если использует Постгре, то вот тут есть решение: http://phpforum.ru/index.php?showtopic=31806&hl=

Если же "дефолт БД", то гугли по словам "nested set mysql".

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

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