SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 21.08.2010 02:59:40

sup
Участник
Зарегистрирован: 19.08.2010
Сообщений: 10

не могу в сложном запросе подсчитать и сформировать breadcrumbs

есть такой запрос:

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)

Неактивен

 

#2 21.08.2010 04:30:31

sup
Участник
Зарегистрирован: 19.08.2010
Сообщений: 10

Re: не могу в сложном запросе подсчитать и сформировать breadcrumbs

Насколько я понимаю, для 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;

но как это вставить чтобы получить массив пути к папке не понимаю...

Неактивен

 

#3 21.08.2010 04:46:46

sup
Участник
Зарегистрирован: 19.08.2010
Сообщений: 10

Re: не могу в сложном запросе подсчитать и сформировать breadcrumbs

Вот такой запрос выполнился без ошибок, но 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

Неактивен

 

#4 21.08.2010 06:37:08

sup
Участник
Зарегистрирован: 19.08.2010
Сообщений: 10

Re: не могу в сложном запросе подсчитать и сформировать breadcrumbs

пробую просто вывести путь, тоже как-то не алё...

вот такая конструкция выводит все дерево до нужного места, вместе со всеми ответвлениями от корня:

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)

Неактивен

 

#5 21.08.2010 10:15:25

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: не могу в сложном запросе подсчитать и сформировать breadcrumbs

Одним запросом при Вашей организации данных это не делается. Есть два стандартных
способа денормализации — таблица «все дети» и nested sets («правое-левое» поля).

Неактивен

 

#6 21.08.2010 12:37:36

sup
Участник
Зарегистрирован: 19.08.2010
Сообщений: 10

Re: не могу в сложном запросе подсчитать и сформировать breadcrumbs

paulus написал:

Одним запросом при Вашей организации данных это не делается. Есть два стандартных
способа денормализации — таблица «все дети» и nested sets («правое-левое» поля).

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

Неактивен

 

#7 21.08.2010 15:41:30

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: не могу в сложном запросе подсчитать и сформировать breadcrumbs

«Все дети» — это табличка, которая просто сопоставляет всю иерархию до конца.
Допустим, у Вас есть вот такие элементы 1 -> 2 -> 3. Тогда табличка вида
id | parent
-----------
3  | 2
3  | 1
2  | 1
решает практически любую задачу по нахождению бабушек-дедушек в один запрос.

Что касается nested sets, то в википедии очень неплохо описана технология:
http://en.wikipedia.org/wiki/Nested_set_model
Грубо говоря, каждый элемент выделяет под собой диапазон значений, и его дети
могут попадать только в этот диапазон. Ну и, разумеется, выделять он может только
из диапазона, в который входит он сам. Чуть более сложная схема организации, но
иногда более простой способ обхода.

Неактивен

 

#8 23.08.2010 01:19:53

sup
Участник
Зарегистрирован: 19.08.2010
Сообщений: 10

Re: не могу в сложном запросе подсчитать и сформировать breadcrumbs

paulus написал:

«Все дети» — это табличка, которая просто сопоставляет всю иерархию до конца.
Допустим, у Вас есть вот такие элементы 1 -> 2 -> 3. Тогда табличка вида
id | parent
-----------
3  | 2
3  | 1
2  | 1
решает практически любую задачу по нахождению бабушек-дедушек в один запрос.

Наверное мне сейчас Nested_set_model не поднять, может позже... а по детям можете подсказать какой запрос должен быть чтобы к каждому элементу получить путь и можно было подсчитать количество уровней вложенности?

Неактивен

 

#9 23.08.2010 03:12:31

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: не могу в сложном запросе подсчитать и сформировать breadcrumbs

Ну, очевидно, SELECT parent FROM all_parents WHERE id = myid smile

Неактивен

 

#10 23.08.2010 04:20:18

sup
Участник
Зарегистрирован: 19.08.2010
Сообщений: 10

Re: не могу в сложном запросе подсчитать и сформировать breadcrumbs

paulus написал:

Ну, очевидно, SELECT parent FROM all_parents WHERE id = myid smile

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

как то так? можно это в одном запросе реализовать, вот в чем вопрос?

Неактивен

 

#11 23.08.2010 14:10:57

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: не могу в сложном запросе подсчитать и сформировать breadcrumbs

Не, так нельзя, конечно — как вы себе представили вывод этого запроса,
если бы он даже заработал? smile

Если нужен текст — просто объедините с таблицей значений.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson