Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как получить последний элемент дерева ? / 6 сообщений из 6, страница 1 из 1
04.04.2017, 17:45
    #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
04.04.2017, 18:30
    #39433115
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить последний элемент дерева ?
Это дерево или всё-таки цепочка? а то тупо запросить ИД приёмника, отсутствующий в ИД контрагента...
...
Рейтинг: 0 / 0
05.04.2017, 08:29
    #39433282
k4889
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить последний элемент дерева ?
Akina,

Ну это скорее цепочка.
Берем ИД контрагента, по нему получаем преемника, если приемник контрагент, то берем его приемника и т.д. пока не найдем последнего. Вот он то мне и нужен.
...
Рейтинг: 0 / 0
05.04.2017, 08:55
    #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
05.04.2017, 09:06
    #39433294
k4889
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить последний элемент дерева ?
Akina,

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


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