Mysql
 sql >> Base de données >  >> RDS >> Mysql

Obtenir tous les enfants par identifiant parent et clause where dans mysql

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).