Hay dos interpretaciones posibles. Por un comentario reciente, entiendo que necesitas el primero:
Excluir hijos de padres excluidos
Entonces, incluso si los niños no son editores, si uno de sus antepasados es editor, deben ser excluidos. Eso significa que debe excluir registros en la consulta más interna:agregue el where
allí:
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))
Incluir hijos de padres excluidos
En esta interpretación, desea que se incluyan los niños editores independientemente de si alguno de sus antepasados debe ser excluido.
Agregue el user_type
campo en el select
list y luego ajuste esa consulta que realiza el filtro, así:
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'
De nuevo, aquí el resultado incluirá también registros cuya jerarquía principal (padre, abuelo, abuelo, ...) podría no estar completamente incluida (porque algunos de ellos podrían ser editores).