Za prvé, vaše verze MySQL (MariaDB 10.3) podporuje běžné tabulkové výrazy, takže máte způsob, jak se vyhnout použití mutujících proměnných ve vašich dotazech. Mutace proměnných v dotazu je způsob, jak provádět hierarchické dotazy dříve, než byly podporovány běžné tabulkové výrazy, ale je to taktika, která je zastaralá a u níž neexistuje žádná zdokumentovaná záruka, že bude vždy fungovat tak, jak bylo zamýšleno.
Zde je tedy dotaz, který provede totéž s běžným tabulkovým výrazem (cte), kde 8 je vzorová hodnota (nahraďte ji výrazem 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;
A nyní, když máte tuto druhou tabulku, můžete nejprve vytvořit společný tabulkový výraz pro definování sjednocení a poté pokračovat výše uvedeným způsobem:
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;