powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / NestedSet - узнать ID корневого узла для произвольного дочернего
8 сообщений из 8, страница 1 из 1
NestedSet - узнать ID корневого узла для произвольного дочернего
    #34695368
CodeMonkey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется иерархическая структура, а именно давно избитая NestedSet (id, parent_id, lft, rgt). У меня задача создать View в котором помимо всех полей таблицы для каждого узла будет показан и ID корневого узла. Подскажите пожалуйста алгоритм нахождения корневого элемента. За пример кода я буду благодарен безумно, я довольно салабо еще разбираюсь в postgres а времени маловато (.
...
Рейтинг: 0 / 0
NestedSet - узнать ID корневого узла для произвольного дочернего
    #34696087
sj_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что есть "корневой узел"? запись когда parent_id = null (или 0)?
...
Рейтинг: 0 / 0
NestedSet - узнать ID корневого узла для произвольного дочернего
    #34696130
CodeMonkey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sj_sqlчто есть "корневой узел"? запись когда parent_id = null (или 0)?

Да. И таких узлов может быть несколько.

Мне нужно получить вот такой результат:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 id | parent_id | lft | rgt |    title    | root_id
----+-----------+-----+-----+-------------+---------
  1 |           |   1 |   8 | Root Node 1 |       
  3 |           |   1 |   4 | Root Node 2 |       
  5 |         3 |   2 |   3 | Node 2.1    |       3
  2 |         1 |   4 |   7 | Node 1.1    |       1
  4 |         2 |   5 |   6 | Node 1.1.1  |       1

...
Рейтинг: 0 / 0
NestedSet - узнать ID корневого узла для произвольного дочернего
    #34696147
sj_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
connectby

выполни
\share\contrib\tablefunc.sql

читай
\doc\contrib\README.tablefunc
...
Рейтинг: 0 / 0
NestedSet - узнать ID корневого узла для произвольного дочернего
    #34696283
v0v4ik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Юзаем рекурсию или цикл с условием. В примере кусок кода где находится поле objectEnvelope корн. елемента:
...............
parentGuid = p_guid;

WHILE parentGuid <> 0 LOOP --пока не дойдем до корневого обьекта(у корн. обьектов parent_guid=0)
SELECT
O.parent_guid,
O.envelope
FROM
object O
WHERE
O.guid = parentGuid
INTO
parentGuid,
objectEnvelope;

END LOOP;

RETURN objectEnvelope;
...
Рейтинг: 0 / 0
NestedSet - узнать ID корневого узла для произвольного дочернего
    #34696340
CodeMonkey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sj_sqlconnectby

выполни
\share\contrib\tablefunc.sql

читай
\doc\contrib\README.tablefunc

Поставил, почитал, но боюсь что не подойдет ибо сторонняя либа на C да и результат в не том формате:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 keyid | parent_keyid | level |       branch
-------+--------------+-------+---------------------
 row2  |              |     0 | row2
 row4  | row2         |     1 | row2~row4
 row6  | row4         |     2 | row2~row4~row6
 row8  | row6         |     3 | row2~row4~row6~row8
 row5  | row2         |     1 | row2~row5
 row9  | row5         |     2 | row2~row5~row9

подобное содержимое branch удручает. О том, как сделать по другому в мане нет ни строчки.
...
Рейтинг: 0 / 0
NestedSet - узнать ID корневого узла для произвольного дочернего
    #34696400
Ми
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня так отработало:
SELECT id, parent_id, lft, rgt, (SELECT keyid FROM connectby('NestedSet', 'parent_id', 'id',id, 0)
AS t(keyid text, parent_keyid text, level int) ORDER BY t.level DESC LIMIT 1) as root_id
FROM NestedSet order by id;
но при этом для корневых записей они же возвращаются в качестве root_id (а надо бы NULL)...
Для нижних уровней нормально.
...
Рейтинг: 0 / 0
NestedSet - узнать ID корневого узла для произвольного дочернего
    #34696456
CodeMonkey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всех благодарю за помощь! v0v4ik, твой код решает.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / NestedSet - узнать ID корневого узла для произвольного дочернего
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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