Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
есть такой запрос:
SELECT node.id
FROM t1 AS node, t1 AS parent
LEFT JOIN t1 AS vid ON vid.parentid = parent.id
WHERE node.id
BETWEEN parent.id
AND parent.id
AND vid.id IS NULL
который выводит корни структуры папок, т.е. последние папку в дереве
таблица имеет вид:
id | parentid | name
как в этом же запросе сформировать для каждой папки подсчет глубины от корня дерева имеющего parentid='0' и сформировать breadcrumbs
количество уровней в дереве не имеет ограничений и сейчас уже достаточно велико...
есть у кого мысли?
Отредактированно sup (21.08.2010 03:02:33)
Неактивен
Насколько я понимаю, для breadcrumbs нужно вставить нечто вроде этого
SELECT node.id
FROM t1 AS node,
t1 AS parent
WHERE node.parentid BETWEEN parent.id AND parent.id
AND parent.id = node.id
ORDER BY node.id;
но как это вставить чтобы получить массив пути к папке не понимаю...
Неактивен
Вот такой запрос выполнился без ошибок, но bread равно NULL... %)
SELECT node.id, (
SELECT node2.id
FROM t1 AS node2, t1 AS parent2
WHERE node2.parentid
BETWEEN parent2.id
AND parent2.id
AND parent2.id = node.id
ORDER BY node2.id
) as bread
FROM t1 AS node, t1 AS parent
LEFT JOIN t1 AS vid ON vid.parentid = parent.id
WHERE node.id
BETWEEN parent.id
AND parent.id
AND vid.id IS NULL
Неактивен
пробую просто вывести путь, тоже как-то не алё...
вот такая конструкция выводит все дерево до нужного места, вместе со всеми ответвлениями от корня:
SELECT parent.id, parent.parentid
FROM t1 AS node, t1 AS parent
WHERE node.parentid BETWEEN parent.id AND node.parentid
AND node.id = '378'
ORDER BY node.id
а нужно только выбранную ветку...
Отредактированно sup (21.08.2010 06:37:43)
Неактивен
Одним запросом при Вашей организации данных это не делается. Есть два стандартных
способа денормализации — таблица «все дети» и nested sets («правое-левое» поля).
Неактивен
paulus написал:
Одним запросом при Вашей организации данных это не делается. Есть два стандартных
способа денормализации — таблица «все дети» и nested sets («правое-левое» поля).
а можно поподробнее о данных способах и что предпочтительнее или правильнее, а также метод организации подобной структуры... или ссылочку на мануал, но желательно хотябы с кратким описанием для тупых.. (я не тупой)
Неактивен
«Все дети» — это табличка, которая просто сопоставляет всю иерархию до конца.
Допустим, у Вас есть вот такие элементы 1 -> 2 -> 3. Тогда табличка вида
id | parent
-----------
3 | 2
3 | 1
2 | 1
решает практически любую задачу по нахождению бабушек-дедушек в один запрос.
Что касается nested sets, то в википедии очень неплохо описана технология:
http://en.wikipedia.org/wiki/Nested_set_model
Грубо говоря, каждый элемент выделяет под собой диапазон значений, и его дети
могут попадать только в этот диапазон. Ну и, разумеется, выделять он может только
из диапазона, в который входит он сам. Чуть более сложная схема организации, но
иногда более простой способ обхода.
Неактивен
paulus написал:
«Все дети» — это табличка, которая просто сопоставляет всю иерархию до конца.
Допустим, у Вас есть вот такие элементы 1 -> 2 -> 3. Тогда табличка вида
id | parent
-----------
3 | 2
3 | 1
2 | 1
решает практически любую задачу по нахождению бабушек-дедушек в один запрос.
Наверное мне сейчас Nested_set_model не поднять, может позже... а по детям можете подсказать какой запрос должен быть чтобы к каждому элементу получить путь и можно было подсчитать количество уровней вложенности?
Неактивен
Ну, очевидно, SELECT parent FROM all_parents WHERE id = myid
Неактивен
paulus написал:
Ну, очевидно, SELECT parent FROM all_parents WHERE id = myid
SELECT node.id
(SELECT parent FROM all_parents WHERE id = node.id)
FROM t1 AS node, t1 AS parent
LEFT JOIN t1 AS vid ON vid.parentid = parent.id
WHERE node.id
BETWEEN parent.id
AND parent.id
AND vid.id IS NULL
как то так? можно это в одном запросе реализовать, вот в чем вопрос?
Неактивен
Не, так нельзя, конечно — как вы себе представили вывод этого запроса,
если бы он даже заработал?
Если нужен текст — просто объедините с таблицей значений.
Неактивен
Страниц: 1