Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически? / 25 сообщений из 32, страница 1 из 2
05.06.2013, 09:15
    #38286210
muravey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
Доброго всем дня!

Вопрос к профи.

Есть дерево AL (section_id, data, parent_id).

Чтобы вывести узел и 2 уровня его потомков делаю так

Код: sql
1.
2.
3.
4.
5.
6.
SELECT s1.*, s2.*, s3.*
FROM sections s1
  RIGHT JOIN sections s2 ON s2.parent_id = s1.section_id
  RIGHT JOIN sections s3 ON s3.parent_id = s2.section_id
  RIGHT JOIN sections s4 ON s4.parent_id = s3.section_id
WHERE s1.section_id = 1;



Уважаемые профи а как вывести всех потомков узла если уровень растет динамически?
...
Рейтинг: 0 / 0
05.06.2013, 10:18
    #38286274
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
muraveyДоброго всем дня!

Вопрос к профи.

Есть дерево AL (section_id, data, parent_id).

Чтобы вывести узел и 2 уровня его потомков делаю так

Код: sql
1.
2.
3.
4.
5.
6.
SELECT s1.*, s2.*, s3.*
FROM sections s1
  RIGHT JOIN sections s2 ON s2.parent_id = s1.section_id
  RIGHT JOIN sections s3 ON s3.parent_id = s2.section_id
  RIGHT JOIN sections s4 ON s4.parent_id = s3.section_id
WHERE s1.section_id = 1;




Уважаемые профи а как вывести всех потомков узла если уровень растет динамически?

динамически формировать секцию фром :)

или переформулировать задачу. А как можно сделать структуру данных, дабы мы легко могли найти всех потомков. впринципе самому можно придумать, можно почитать nested sets
...
Рейтинг: 0 / 0
05.06.2013, 10:24
    #38286283
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
alex564657498765453,

... или прочитать фак по деревьям, пришпиленный тут вверху. :)
...
Рейтинг: 0 / 0
05.06.2013, 10:30
    #38286299
muravey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
alex564657498765453 можно почитать nested sets

Уважаемый я же пишу, что нужно для дерева AL.
...
Рейтинг: 0 / 0
05.06.2013, 10:31
    #38286302
muravey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
Arhat109alex564657498765453,

... или прочитать фак по деревьям, пришпиленный тут вверху. :)

Там нет конкретного решения, все сырое. Может кто уже делал. Наведите хотя бы на алгоритм выборки.
...
Рейтинг: 0 / 0
05.06.2013, 10:46
    #38286325
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
muravey,

там полно конкретных решений. Собственно только они и есть, даже некоторые с анализом. Сомневаюсь, что вы сможете найти конктретику именно под вашу структуру таблиц, имен и т.д.
...
Рейтинг: 0 / 0
05.06.2013, 11:58
    #38286485
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
muraveyalex564657498765453 можно почитать nested sets

Уважаемый я же пишу, что нужно для дерева AL.

не все в первую очередь учат крутые буржуйские абривиатуры :)
...
Рейтинг: 0 / 0
05.06.2013, 12:14
    #38286509
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
Arhat109Сомневаюсь, что вы сможете найти конктретику именно под вашу структуру таблиц, имен и т.д.Ну почему же? Вот тут сможет... если жаба не задавит
...
Рейтинг: 0 / 0
05.06.2013, 12:20
    #38286523
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
про e alex564657498765453не все в первую очередь учат крутые буржуйские абривиатуры :)Гугол про "AL tree" ничего не знает.
https://www.google.ru/search?q=AL tree
Результаты:
Alabama State Tree
Auburn University trees poisoned by angry Alabama fan
Banyan Tree Al Wadi Ras Al Khaimah 1
Al's Tree Service

Так что либо аббревиатура не такая уж крутая, либо, напротив, настолько крутая и засекреченная, что за ТСом уже выехал пативэн, а тема будет безжалостно удалена - и хорошо, если только тема :)
...
Рейтинг: 0 / 0
05.06.2013, 13:00
    #38286615
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
tanglirпро e alex564657498765453не все в первую очередь учат крутые буржуйские абривиатуры :)Гугол про "AL tree" ничего не знает.
https://www.google.ru/search?q=AL tree
Результаты:
Alabama State Tree
Auburn University trees poisoned by angry Alabama fan
Banyan Tree Al Wadi Ras Al Khaimah 1
Al's Tree Service

Так что либо аббревиатура не такая уж крутая, либо, напротив, настолько крутая и засекреченная, что за ТСом уже выехал пативэн, а тема будет безжалостно удалена - и хорошо, если только тема :)

вот и я про тоже. тоже гуглил и на википедии статьи по деревьям посмотрел.


ЗЫ давно подмечено,чем больше знает человек по сути дела, тем меньше крутых абривиатур он знает :)
...
Рейтинг: 0 / 0
05.06.2013, 15:45
    #38286942
muravey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
Есть три типа организации данных дерева:

Материализованный путь (Materialized Path)
Код: sql
1.
2.
3.
4.
5.
CREATE TABLE mp_tree (
    `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(50) NOT NULL,
    `path` VARCHAR(100) NOT NULL
) TYPE=InnoDB DEFAULT CHARSET=utf8;



Вложенное множество (Nested Set)
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE ns_tree (
    `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(50) NOT NULL,
    `lft` BIGINT NOT NULL,
    `rgt` BIGINT NOT NULL,
    `level` BIGINT NOT NULL
) TYPE=InnoDB DEFAULT CHARSET=utf8;



Список смежных вершин (Adjacency List)
Код: sql
1.
2.
3.
4.
5.
CREATE TABLE al_tree (
    `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `parent_id` BIGINT NULL,
    `name` VARCHAR(50) NOT NULL
) TYPE=InnoDB DEFAULT CHARSET=utf8;



Вот для типа смежных вершин и нужно решение.
Странно что даже никто никуда не послал в нужном направлении.

А на счет буржуйских абревиатур, дак и MySql буржуйская. Или я у вас по российскому СУБД спрашиваю.

Странно что никто ничего незнает.
...
Рейтинг: 0 / 0
06.06.2013, 05:53
    #38287699
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
muraveyСписок смежных вершин"По-русски" это называется "родитель-потомок". Ни разу до вчерашнего дня не слышал, чтобы тут такое дерево назвали "списком смежных вершин". Как говорится, "о, сколько нам открытий чудных..." :)
muraveyСтранно что никто ничего незнает.Странно, что кто-то уверен, будто форумчане обязаны переписывать примеры из фака под его структуру. Тем более, что задача совершенно стандартная, там и переписывать-то практически нечего - только заменить имена полей и таблиц...
...
Рейтинг: 0 / 0
06.06.2013, 06:40
    #38287708
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
Совсем народ обленился,
только названия таблиц надо было поменять
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SET group_concat_max_len = 65535;#размер буфера для хранения извлеченных узлов
SET @a ='1';#узел предка, несколько узлов через запятую можно перечислять
SELECT @index:=INSTR(@a,',') as coma_index,
@id:=SUBSTRING_INDEX(@a, ',', 1)  as id,
@a:=SUBSTRING(@a,IF(@index,@index+1,0)),
@a:=CONCAT_WS(IF(LENGTH(@a)>0,',',''),@a,(SELECT group_concat(id) FROM al_tree WHERE parent_id=@id)) as array
FROM al_tree
WHERE LENGTH(@a)>0
...
Рейтинг: 0 / 0
06.06.2013, 06:40
    #38287709
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
bochkovСовсем народ обленился,Не переживай, годика через два и ты обленишься :)
...
Рейтинг: 0 / 0
13.06.2013, 21:21
    #38296958
muravey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
bochkov, Спасибо за отклик.

Вот мое решение, может кому пригодится.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
CREATE PROCEDURE get_sections_in_parent`(IN inParentId INT(11))
BEGIN
    DECLARE ids MEDIUMTEXT DEFAULT '';

    SET @parents = inParentId;

    REPEAT
        SET ids = CONCAT(ids, IF(LENGTH(ids), ',', ''), @parents);
        
        SET @stm = CONCAT(
            'SELECT GROUP_CONCAT(section_id) INTO @parents 
             FROM sections 
             WHERE parent_id IN (', @parents, ')'
        );

        PREPARE fetch_childs FROM @stm;
        EXECUTE fetch_childs;
        DROP PREPARE fetch_childs;

    UNTIL (@parents IS NULL) END REPEAT;
    
    SET @stm = CONCAT (
        'SELECT *
        FROM sections
        WHERE section_id IN (', ids, ')'
    );

    PREPARE statement FROM @stm;
    EXECUTE statement ;
    DROP PREPARE statement;
END$$
...
Рейтинг: 0 / 0
03.07.2013, 00:10
    #38317949
labirint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
bochkovСовсем народ обленился,
только названия таблиц надо было поменять
Мне тоже нужен такой запрос.
bochkov, а где тут названия таблиц? И что есть названия полей?
П.С. мы(я) не обленились, просто чайники :)
bochkov
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SET group_concat_max_len = 65535;#размер буфера для хранения извлеченных узлов
SET @a ='1';#узел предка, несколько узлов через запятую можно перечислять
SELECT @index:=INSTR(@a,',') as coma_index,
@id:=SUBSTRING_INDEX(@a, ',', 1)  as id,
@a:=SUBSTRING(@a,IF(@index,@index+1,0)),
@a:=CONCAT_WS(IF(LENGTH(@a)>0,',',''),@a,(SELECT group_concat(id) FROM al_tree WHERE parent_id=@id)) as array
FROM al_tree
WHERE LENGTH(@a)>0
...
Рейтинг: 0 / 0
03.07.2013, 00:52
    #38317977
labirint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
bochkov,

кстати, у меня есть задача - посложнее, по крайней мере - на мой взгляд:
построение древовидной структуры по следующим правилам:
партнерская программа, многоуровневая: любой член - родитель, и он же ребенок, за исключением самого первого. Член приглашает в структуру людей любое количество, но под ним могут записаться только 5 чел, остальные пишутся на уровень ниже - его детям: сначала 1-му - все 5, затем - 2-му и т.д.
Как заполнился уровень из этих пяти, а тот же родитель все зазывает и зазывает, следующие пишутся в 3-й уровень - его внукам и т.д.
Возможно ли построить один запрос для такого способа построения структуры или хотя бы не один, а ограниченное число запросов, а то сейчас у меня рекурсия и число запросов просто дикое :(
При этом есть еще небольшая вариация: когда у родителя заполняется 3-й уровень, т.е. 125 детей - он имеет право записать себе в 1-й уровень - 6-го ребенка и строить ему все уровни, как и предыдущим. Заполнил 5 уровней - пишет себе 7-го и ему строит структуру и т.д. - максимум - 9.
...
Рейтинг: 0 / 0
01.07.2014, 19:07
    #38685081
DmitryFix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
bochkov,

а такой же (или процедурки), только в обратную сторону нет?
т.е. по ИД вывести всю цепочку до рута

есть такая, только ее доделать чтобы дополняла еще конечными элементами(без детей) по пути
SET @child_id = 10;
SELECT @child_id, @child_id := (
SELECT PARENT_
FROM table
WHERE ID_ = @child_id
LIMIT 1)
FROM
table
WHERE @child_id IS NOT NULL
...
Рейтинг: 0 / 0
02.07.2014, 01:41
    #38685287
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
DmitryFix,
то же самое, только
Код: sql
1.
(SELECT group_concat(parent_id) FROM al_tree WHERE id=@id)
...
Рейтинг: 0 / 0
02.07.2014, 12:11
    #38685608
DmitryFix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
bochkovDmitryFix,
то же самое, только
Код: sql
1.
(SELECT group_concat(parent_id) FROM al_tree WHERE id=@id)



вот допустим сейчас возвращает от выделенной строки
76, 74, 73, 72
...
Рейтинг: 0 / 0
02.07.2014, 12:16
    #38685613
DmitryFix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
а еще бы добавить 75, 77, 78 т.е. конечные узлы у которых нет детей
(они у меня в базе даже поле отдельное имеют IS_DIR = 0 конечный узел, IS_DIR = 1 разветление)
...
Рейтинг: 0 / 0
06.07.2014, 02:34
    #38688761
DmitryFix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
эх, у меня получается очень громоздко
...
Рейтинг: 0 / 0
06.07.2014, 04:39
    #38688766
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
Выложи дамп, что нибудь придумаю
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
27.12.2017, 19:18
    #39577084
dalph
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
bochkov,

Доработал до решения в одну строку:
Код: sql
1.
2.
3.
4.
5.
SET group_concat_max_len = 65535;#размер буфера для хранения извлеченных узлов
SET @a:='1';#узел предка, несколько узлов через запятую можно перечислять
SELECT group_concat(@a:=(SELECT group_concat(id) FROM test1 WHERE FIND_IN_SET(parent_id,@a))) as array
FROM test1
WHERE LENGTH(@a)>0
...
Рейтинг: 0 / 0
28.12.2017, 12:09
    #39577345
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
dalphbochkov,

Доработал до решения в одну строку:
Код: sql
1.
2.
3.
4.
5.
SET group_concat_max_len = 65535;#размер буфера для хранения извлеченных узлов
SET @a:='1';#узел предка, несколько узлов через запятую можно перечислять
SELECT group_concat(@a:=(SELECT group_concat(id) FROM test1 WHERE FIND_IN_SET(parent_id,@a))) as array
FROM test1
WHERE LENGTH(@a)>0


навскидку
действительно работает
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически? / 25 сообщений из 32, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]