Как выбрать нижестоящих пользователей с помощью запроса mysql? - PullRequest
1 голос
/ 11 апреля 2020

Я хочу выбрать нижестоящих пользователей по идентификатору пользователя.

Это моя структура таблицы:

"userid", "sponsorID", "username"

И данные в таблице:

1, 0, noman
2, 1, jani
3, 2, usman
4, 3, hassan
5, 4, ahmad
6, 5, haroon
7, 1, sabir

Мне нужны такие данные:

"Select * from table where sponsorID = 1

Это должно выбрать всех пользователей нижестоящего уровня, то есть сначала следует выбрать пользователя 2, затем он также выберет пользователя 3, потому что пользователь 2 спонсируется пользователем 1 и пользователь 3 спонсируется пользователем 2 и выберет весь нисходящий канал с этим сценарием.

Я пробовал:

select * from table where sponsorID = '1'

Но он выбирает только одного пользователя, и я хочу весь нисходящий данные пользователей.

Я не знаю, как выполнить запрос в mysql, чтобы получить нужные данные. Если кто-нибудь знает, пожалуйста, дайте мне пример.

1 Ответ

2 голосов
/ 11 апреля 2020

Если вы используете MySQL 8.0, вы можете решить это с помощью рекурсивного запроса:

with recursive cte as (
    select userid, sponsorid, username, 1 lvl from mytable where sponsorid = 1
    union all
    select t.user, t.sponsorid, t.username, c.lvl + 1
    from cte c
    inner join mytable t on t.sponsorid = c.userid
)
select * from cte

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

В качестве бонуса я добавил столбец lvl, который представляет глубину каждого узла в дереве.

Обратите внимание, что для этого не требуются циклические ссылки в дереве.

...