Có thể có hai cách giải thích. Từ một nhận xét gần đây, tôi hiểu rằng bạn cần nhận xét đầu tiên:
Loại trừ con của các bậc cha mẹ bị loại trừ
Vì vậy, ngay cả khi trẻ em không phải là biên tập viên, nếu một trong những tổ tiên của chúng là biên tập viên, chúng nên bị loại trừ. Điều đó có nghĩa là bạn nên loại trừ các bản ghi trong truy vấn bên trong nhất:thêm where
ở đó:
select id,
name,
parent_id,
user_type
from (select * from p
where user_type <> 'editor'
order by parent_id, id) products_sorted,
(select @pv := '19') initialisation
where find_in_set(parent_id, @pv)
and length(@pv := concat(@pv, ',', id))
Bao gồm con cái của các bậc cha mẹ bị loại trừ
Theo cách hiểu này, bạn muốn bao gồm các phần tử con của người biên tập bất kể có bất kỳ tổ tiên nào của chúng bị loại trừ hay không.
Thêm user_type
trong trường select
danh sách và sau đó bao bọc truy vấn thực hiện bộ lọc, như sau:
select *
from (
select id,
name,
parent_id,
user_type
from (select * from p
order by parent_id, id) products_sorted,
(select @pv := '19') initialisation
where find_in_set(parent_id, @pv)
and length(@pv := concat(@pv, ',', id))
) as sub
where user_type <> 'editor'
Vì vậy, một lần nữa, ở đây kết quả cũng sẽ bao gồm các bản ghi mà hệ thống cấp bậc cha mẹ (cha mẹ, ông bà, ông bà nội, ...) có thể không được đưa vào hoàn toàn (vì một số trong số đó có thể được chỉnh sửa).