Pertama, versi MySQL Anda (MariaDB 10.3) mendukung ekspresi tabel umum, jadi Anda memiliki cara untuk menghindari penggunaan variabel yang bermutasi dalam kueri Anda. Memutasi variabel dalam kueri telah menjadi cara untuk melakukan kueri hierarki sebelum ekspresi tabel umum didukung, tetapi ini adalah taktik yang tidak digunakan lagi dan tidak ada jaminan terdokumentasi bahwa itu akan selalu berfungsi sebagaimana dimaksud.
Jadi, inilah kueri untuk melakukan hal yang sama dengan ekspresi tabel umum (cte), di mana 8 adalah nilai contoh (ganti dengan ekspresi 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;
Dan sekarang, ketika Anda memiliki tabel kedua ini, pertama-tama Anda dapat melakukan ekspresi tabel umum untuk mendefinisikan gabungan, dan kemudian melanjutkan seperti di atas:
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;