Sono possibili due interpretazioni. Da un recente commento ho capito che ti serve il primo:
Escludi i figli dei genitori esclusi
Quindi anche se i bambini non sono editori, se uno dei loro antenati è un editore dovrebbero essere esclusi. Ciò significa che dovresti escludere i record nella query più interna:aggiungi il where
lì:
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))
Includi i figli di genitori esclusi
In questa interpretazione vuoi che i figli editor siano inclusi indipendentemente dal fatto che uno dei loro antenati debba essere escluso.
Aggiungi il user_type
campo nel select
list e quindi avvolgere la query che esegue il filtro, in questo modo:
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'
Quindi, ancora una volta, qui il risultato includerà anche i record di cui la gerarchia dei genitori (genitore, nonno, nonno, ...) potrebbe non essere completamente inclusa (perché alcuni di questi potrebbero essere editor).