Deux interprétations sont possibles. D'après un commentaire récent, je comprends que vous avez besoin du premier :
Exclure les enfants de parents exclus
Ainsi, même si les enfants ne sont pas éditeurs, si l'un de leurs ancêtres est éditeur, ils doivent être exclus. Cela signifie que vous devez exclure les enregistrements dans la requête la plus interne :ajoutez le 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))
Inclure les enfants des parents exclus
Dans cette interprétation, vous souhaitez que les enfants éditeurs soient inclus, que l'un de leurs ancêtres soit exclu ou non.
Ajoutez le user_type
champ dans le select
list, puis encapsulez cette requête qui exécute le filtre, comme ceci :
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'
Encore une fois, ici, le résultat inclura également des enregistrements dont la hiérarchie des parents (parent, grand-parent, grand-grand-parent, ...) pourrait ne pas être complètement incluse (car certains d'entre eux pourraient être éditeur).