Đầu tiên, phiên bản MySQL (MariaDB 10.3) của bạn hỗ trợ các biểu thức bảng phổ biến, vì vậy bạn có một cách để tránh việc sử dụng các biến thay đổi trong các truy vấn của mình. Việc thay đổi các biến trong một truy vấn là một cách để thực hiện các truy vấn phân cấp trước khi các biểu thức bảng phổ biến được hỗ trợ, nhưng đó là một chiến thuật không được dùng nữa và không có tài liệu đảm bảo rằng nó sẽ luôn hoạt động như dự định.
Vì vậy, đây là truy vấn để thực hiện tương tự với một biểu thức bảng chung (cte), trong đó 8 là giá trị mẫu (thay thế nó bằng biểu thức 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;
Và bây giờ, khi bạn có bảng thứ hai này, trước tiên bạn có thể thực hiện một biểu thức bảng chung để xác định liên hợp, sau đó tiếp tục như trên:
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;