php, mysql. Найти вложенные пункты в базе

Ragnarok
На сайте с 25.06.2010
Offline
239
1025

Всё просто.

Есть меню, структурой вида:

Еда (id 1)

Рецепты (id 2)
Первое (id 3)
Второе (id 4)
Фото (id 5)

т.е. для "Первое" и "Второе" родителем будет "Рецепты", для "Рецепты" и "Фото" родитель "Еда" и т.п.

В таблице mysql это хранится в виде:

id parent_id title

1 0 Еда
2 1 Рецепты
3 2 Первое
4 2 Второе
5 1 Фото

Нужно узнать id всех вложенных категорий для какого-то определённого элемента.

Например, для Рецепты (id 2) вложенными будут Первое (parent_id 2) и Второе (parent_id 2)

Первоначальное решение


$category_id=2;
"SELECT id FROM table WHERE parent_id = '$category_id'";

работает, но для более высокого уровня (все вложеные для Еда) так найти уже не получается: находит только Рецепты (parent_id 1) и Фото (parent_id 1).

Исходя из поставленных условий, как найти все вложенные категории? Какой-то сложносоставной sql-запрос, может быть. Или тупо костылём влепить 3 запроса подряд (1 находим вложенные, 2 находим вложенные вложенных, 3 находим вложенные вложенных вложенных)?

//TODO: перестать откладывать на потом
IL
На сайте с 20.04.2007
Offline
435
#1

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

А вообще, выборка по adjacency list делается рекурсивно в несколько запросов.. каждый следующий - WHERE parent_id IN(1,2,3) |в скобках - ID-шники, найденные на предыдущем этапе|.. повторять, пока что-нибудь находится :)

Для выборки одним запросом потребуется подправить структуру базы.. к примеру, использовать Nested sets

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

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий