SK
-- Родительские коды мб только один! и выдан один раз!
drop table refer;
create table refer (
code varchar(8) not null, -- код свой
parent varchar(8) not null, -- родительский код
tid int not null -- telegram id персоны
);
create index refer_code on refer(code);
create index refer_parent on refer(parent);
create index refer_tid on refer(tid);
-- is_code_under(from_code, match_code, recursion_depth);
-- Ищет match_code начиная с parent = from_code, ограничивает рекурсию.
create or replace function is_code_under(p_from varchar(8), p_match varchar(8), depth int) returns int
language plpgsql
as $$
declare
rc int;
begin
with recursive tids(code,parent,tid) as (
select refer.code,refer.parent,refer.tid
from refer where parent=$1
union
select refer.code,refer.parent,refer.tid from refer,tids where tids.code=refer.parent
) select count(*) into rc from tids where code = $2 limit $3;
return rc;
end;
$$;
Вот функция, которая ищет в дереве от текущего узла до корня, есть такой некий ключ там уже или нет.
Это реферальная система для телеги: тебе дают ключик, ты его всем раздаёшь, люди с ним регситрятся, получают скидос, тебе тоже скидос. Чем больше с твоим ключом народу, тебе больше плюшек. Блаблабла...
По сути же это дерево. твой овнер_ид -- у меня называется parent, code - это типа id. tid - полезные данные какие-то, не обращай внимания. У меня возвращается количество совпадений заданного code. тебе же можно просто выводить туплы.
Это постгрес, если что.


