Първо, вашата версия на MySQL (MariaDB 10.3) поддържа общи таблични изрази, така че имате начин да избегнете използването на мутиращи променливи във вашите заявки. Мутирането на променливи в заявка е начин за изпълнение на йерархични заявки преди да се поддържат изрази за общи таблици, но това е тактика, която е отхвърлена и за която няма документирана гаранция, че винаги ще работи по предназначение.
И така, ето заявката да направите същото с общ израз на таблица (cte), където 8 е примерната стойност (заменете го с израза PHP):
with recursive
cte as (
select 1 as categoryDepth,
c.*
from tbl_categories c
where categoryId = 8
union
select cte.categoryDepth + 1,
c.*
from cte
inner join tbl_categories c
on c.categoryId = cte.categoryParentId
)
select *
from cte
order by categoryDepth desc;
И сега, когато имате тази втора таблица, можете първо да направите общ израз на таблица за дефиниране на съюза и след това да продължите както по-горе:
with recursive
base as (
select * from tbl_categories
union
select * from tbl_categories_custom
),
cte as (
select 1 as categoryDepth,
base.*
from base
where categoryId = 8
union
select cte.categoryDepth + 1,
base.*
from cte
inner join base
on base.categoryId = cte.categoryParentId
)
select *
from cte
order by categoryDepth desc;