powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как получить последний элемент дерева ?
6 сообщений из 6, страница 1 из 1
Как получить последний элемент дерева ?
    #39433089
k4889
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица (пример):
Контрагент(ИД)Преемник(ИД)122334477665
Зная ИД Контрагента = 1, рекурсивным запросом получаю всех приемников вниз по дереву = 2,3,4,7,6,5
Как из этой рекурсии получить последнее значение, т.е. 5 ?

Элементы таблицы могут добавляться и редактироваться в любом порядке, поэтому сортировка по id или order by отпадает.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
--Vid = ИД справочника
--Org = поле контрагент
--Org2 = поле приемник
 
WITH receiver (Org2) AS
(
    SELECT Org2 FROM MBAnalit WHERE Vid = %0:s and Org = %1:s    
    union all   
    SELECT successor.Org2 FROM MBAnalit successor
    JOIN receiver ON successor.Org = receiver.Org2
    WHERE Vid = %0:s
)
SELECT Org2 FROM receiver where Org2 is not null
...
Рейтинг: 0 / 0
Как получить последний элемент дерева ?
    #39433115
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это дерево или всё-таки цепочка? а то тупо запросить ИД приёмника, отсутствующий в ИД контрагента...
...
Рейтинг: 0 / 0
Как получить последний элемент дерева ?
    #39433282
k4889
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Ну это скорее цепочка.
Берем ИД контрагента, по нему получаем преемника, если приемник контрагент, то берем его приемника и т.д. пока не найдем последнего. Вот он то мне и нужен.
...
Рейтинг: 0 / 0
Как получить последний элемент дерева ?
    #39433288
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда только хранимка или функция. Схематично, например, так:

Код: 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.
DROP FUNCTION IF EXISTS GetLeaf;

DELIMITER @@;

CREATE FUNCTION GetLeaf(IN Root INT)
RETURNS INT
AS 
DECLARE PreviousNode INT;
DECLARE NextNode INT DEFAULT 0;
SET PreviousNode = Root;
BEGIN
    WHILE NextNode IS NOT NULL
        SELECT `Преемник` INTO NextNode
        FROM `table`
        WHERE `Контрагент` = PreviousNode
        LIMIT 1;
    END WHILE;
    RETURN PreviousNode;
END;
@@;

DELIMITER ;

SELECT GetLeaf(1) FROM DUAL;
...
Рейтинг: 0 / 0
Как получить последний элемент дерева ?
    #39433294
k4889
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Увы, не работает.
Спасибо за помощь.
...
Рейтинг: 0 / 0
Как получить последний элемент дерева ?
    #39433299
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так это же только схема, идея. Доведи её до ума - заработает.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как получить последний элемент дерева ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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