Es sind zwei Deutungen möglich. Aus einem kürzlichen Kommentar geht hervor, dass Sie den ersten benötigen:
Kinder von ausgeschlossenen Eltern ausschließen
Selbst wenn also Kinder keine Redakteure sind, sollten sie ausgeschlossen werden, wenn einer ihrer Vorfahren ein Redakteur ist. Das bedeutet, dass Sie Datensätze in der innersten Abfrage ausschließen sollten:Fügen Sie das where
hinzu dort:
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))
Kinder von ausgeschlossenen Eltern einbeziehen
In dieser Interpretation möchten Sie, dass Editor-Kinder unabhängig davon eingeschlossen werden, ob einer ihrer Vorfahren ausgeschlossen werden soll.
Fügen Sie den user_type
hinzu Feld im select
list auf und umschließe dann die Abfrage, die den Filter ausführt, wie folgt:
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'
Auch hier enthält das Ergebnis also auch Datensätze, deren Elternhierarchie (Eltern, Großeltern, Großeltern, ...) möglicherweise nicht vollständig enthalten sind (weil einige davon Bearbeiter sein könnten).