powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
25 сообщений из 32, страница 1 из 2
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38286210
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;



Уважаемые профи а как вывести всех потомков узла если уровень растет динамически?
...
Рейтинг: 0 / 0
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38286274
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38286283
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,

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

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

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

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

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

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

не все в первую очередь учат крутые буржуйские абривиатуры :)
...
Рейтинг: 0 / 0
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38286509
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109Сомневаюсь, что вы сможете найти конктретику именно под вашу структуру таблиц, имен и т.д.Ну почему же? Вот тут сможет... если жаба не задавит
...
Рейтинг: 0 / 0
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38286523
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
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38286615
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38286942
muravey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть три типа организации данных дерева:

Материализованный путь (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
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38287699
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muraveyСписок смежных вершин"По-русски" это называется "родитель-потомок". Ни разу до вчерашнего дня не слышал, чтобы тут такое дерево назвали "списком смежных вершин". Как говорится, "о, сколько нам открытий чудных..." :)
muraveyСтранно что никто ничего незнает.Странно, что кто-то уверен, будто форумчане обязаны переписывать примеры из фака под его структуру. Тем более, что задача совершенно стандартная, там и переписывать-то практически нечего - только заменить имена полей и таблиц...
...
Рейтинг: 0 / 0
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38287708
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
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38287709
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bochkovСовсем народ обленился,Не переживай, годика через два и ты обленишься :)
...
Рейтинг: 0 / 0
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38296958
muravey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38317949
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38317977
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bochkov,

кстати, у меня есть задача - посложнее, по крайней мере - на мой взгляд:
построение древовидной структуры по следующим правилам:
партнерская программа, многоуровневая: любой член - родитель, и он же ребенок, за исключением самого первого. Член приглашает в структуру людей любое количество, но под ним могут записаться только 5 чел, остальные пишутся на уровень ниже - его детям: сначала 1-му - все 5, затем - 2-му и т.д.
Как заполнился уровень из этих пяти, а тот же родитель все зазывает и зазывает, следующие пишутся в 3-й уровень - его внукам и т.д.
Возможно ли построить один запрос для такого способа построения структуры или хотя бы не один, а ограниченное число запросов, а то сейчас у меня рекурсия и число запросов просто дикое :(
При этом есть еще небольшая вариация: когда у родителя заполняется 3-й уровень, т.е. 125 детей - он имеет право записать себе в 1-й уровень - 6-го ребенка и строить ему все уровни, как и предыдущим. Заполнил 5 уровней - пишет себе 7-го и ему строит структуру и т.д. - максимум - 9.
...
Рейтинг: 0 / 0
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38685081
DmitryFix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38685287
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryFix,
то же самое, только
Код: sql
1.
(SELECT group_concat(parent_id) FROM al_tree WHERE id=@id)
...
Рейтинг: 0 / 0
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38685608
DmitryFix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bochkovDmitryFix,
то же самое, только
Код: sql
1.
(SELECT group_concat(parent_id) FROM al_tree WHERE id=@id)



вот допустим сейчас возвращает от выделенной строки
76, 74, 73, 72
...
Рейтинг: 0 / 0
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38685613
DmitryFix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а еще бы добавить 75, 77, 78 т.е. конечные узлы у которых нет детей
(они у меня в базе даже поле отдельное имеют IS_DIR = 0 конечный узел, IS_DIR = 1 разветление)
...
Рейтинг: 0 / 0
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38688761
DmitryFix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
эх, у меня получается очень громоздко
...
Рейтинг: 0 / 0
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #38688766
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выложи дамп, что нибудь придумаю
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #39577084
dalph
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
    #39577345
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
25 сообщений из 32, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как вывести всех потомков узла дерева(AL) на MySQL если уровень растет динамически?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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