Получить всех детей по родительскому идентификатору и предложению where в mysql - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть таблица, в которой хранятся id и parent_id в одной таблице.Я хочу рекурсивный запрос, который принимает parent_id в качестве аргумента и возвращает все дочерние узлы с n-го уровня.Для этого я использую этот код и работаю правильно для меня.

select  id,
        name,
        parent
from    (select * from tablename
         order by parent, id) tablename,
        (select @pv := '1') initialisation
where   find_in_set(parent, @pv) > 0
and     @pv := concat(@pv, ',', id)

Моя проблема начинается здесь: Я хочу добавить предложение WHERE с набором результатов, но не могу этого сделать.В наборе результатов я получаю тип пользователя как 'admin', 'editor'.

Я хочу удалить 'editor' тип пользователя из набора результатов.Дайте мне знать, если возможно, как это получить?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Возможны две интерпретации.Из недавнего комментария я понимаю, что вам нужен первый:

Исключите детей исключенных родителей

Так что даже если дети не являются редакторами, если один из их предков является редактором, их следует исключить.Это означает, что вы должны исключить записи в самом внутреннем запросе: добавьте туда where:

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

Включить детей исключенных родителей

В этой интерпретации вы хотите, чтобы дети редактора были включены независимоо том, следует ли исключить кого-либо из их предков.

Добавьте поле user_type в список select, а затем оберните запрос, выполняющий фильтр, следующим образом:

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'

Итак, опять же, здесь результат будет включать также записи, родительская иерархия которых (родитель, дедушка, бабушка и дедушка, ...) может быть не полностью включена (поскольку некоторые из них могут быть редактором).

0 голосов
/ 20 декабря 2018

Я думаю, что будет проще создать объединение, чем использовать подзапросы, но, не видя дизайна таблиц, которые вы используете, боюсь, я не могу дать вам хороший пример.

...