Trong từ trên xuống phương thức truy vấn ban đầu chỉ nên chọn các gốc (các mục không có cha mẹ), do đó, truy vấn chỉ trả về mỗi hàng một lần:
with recursive top_down as (
select id, parent, text
from test
where parent is null
union all
select t.id, t.parent, concat_ws('/', r.text, t.text)
from test t
join top_down r on t.parent = r.id
)
select id, text
from top_down
where id = 4 -- input
Nếu mục tiêu của bạn là tìm một mặt hàng cụ thể, hãy từ dưới lên cách tiếp cận hiệu quả hơn:
with recursive bottom_up as (
select id, parent, text
from test
where id = 4 -- input
union all
select r.id, t.parent, concat_ws('/', t.text, r.text)
from test t
join bottom_up r on r.parent = t.id
)
select id, text
from bottom_up
where parent is null
Loại bỏ điều kiện cuối cùng ở đâu trong cả hai truy vấn để thấy sự khác biệt.
Kiểm tra nó trong trình sắp xếp lại.