Po pierwsze, Twoja wersja MySQL (MariaDB 10.3) obsługuje popularne wyrażenia tabelowe, dzięki czemu możesz uniknąć używania zmiennych mutujących w zapytaniach. Mutowanie zmiennych w zapytaniu jest sposobem wykonywania zapytań hierarchicznych zanim popularne wyrażenia tabelowe były obsługiwane, ale jest to taktyka, która jest przestarzała i dla której nie ma udokumentowanej gwarancji, że zawsze będzie działać zgodnie z przeznaczeniem.
Oto zapytanie, aby zrobić to samo ze wspólnym wyrażeniem tabelowym (cte), gdzie 8 jest wartością przykładową (zastąp ją wyrażeniem 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 teraz, gdy masz drugą tabelę, możesz najpierw wykonać wspólne wyrażenie tabelowe do zdefiniowania unii, a następnie kontynuować jak powyżej:
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;