Ada dua kemungkinan interpretasi. Dari komentar baru-baru ini, saya mengerti Anda membutuhkan yang pertama:
Mengecualikan anak-anak dari orang tua yang dikecualikan
Jadi meskipun anak-anak bukan editor, jika salah satu nenek moyangnya adalah editor, mereka harus dikeluarkan. Itu berarti Anda harus mengecualikan catatan di kueri paling dalam:tambahkan where
di sana:
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))
Sertakan anak-anak dari orang tua yang dikecualikan
Dalam interpretasi ini Anda ingin anak-anak editor disertakan terlepas dari apakah ada leluhur mereka yang akan dikecualikan.
Tambahkan user_type
bidang di select
list dan kemudian bungkus kueri yang melakukan filter, seperti ini:
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'
Jadi sekali lagi, di sini hasilnya akan menyertakan juga catatan yang hierarki induknya (orang tua, kakek-nenek, kakek-nenek, ...) mungkin tidak sepenuhnya disertakan (karena beberapa di antaranya bisa menjadi editor).