Как реализовать многоуровневую рефералку?

Тема в разделе "Как сделать...", создана пользователем Burunduk1982, 30 апр 2015.

  1. Burunduk1982

    Burunduk1982

    Регистр.:
    26 мар 2007
    Сообщения:
    627
    Симпатии:
    112
    Приветствую всех! Начну, наверное, с избитой фразы "в php (да и в чем-то еще) я не силен". Но столкнулся с задачей развернуть многоуровневую реферальную систему на сайте php+MySQL.

    Уровень рефералки определяется наследственными связями user_id и parent_id:

    Пример:
    User_id = 27, parent_id = 3
    (юзер с id27 является рефералом для юзера с id3, а в своей реферальной ветке 27й стоит на 0 ур.)

    User_id = 27 (ур 0)
    User_id = 29, parent_id = 27 (ур 1)
    User_id = 31, parent_id = 27 (ур 1)
    User_id = 32, parent_id = 27 (ур 1)
    User_id = 48, parent_id = 29 (ур 2)
    User_id = 54, parent_id = 32 (ур 2)
    User_id = 55, parent_id = 48 (ур 3)
    User_id = 56, parent_id = 54 (ур 3)
    User_id = 59, parent_id = 48 (ур 3)
    User_id = 83, parent_id = 56 (ур 4)
    User_id = 86, parent_id = 56 (ур 4)

    Необходимо вывести из базы всё реферальное дерево конкретного пользователя. В приведенном примере для пользователя с id27 нужно получить следующую картинку:

    [0]=> "27", [1]=> "29,31,32", [2]=> "48,54", [3]=> "55,56,59", [4]=> "83,86", ...

    При этом, дерево нужно выводить полностью (бесконечно), насколько существует наследственная связь между user_id и parent_id.

    Т.е. для User с id3 дерево приобретет следующий вид:

    [0]=> "3", [1]=> "27", [2]=> "29,31,32", [3]=> "48,54", [4]=> "55,56,59", [5]=> "83,86", ...

    А если у юзера с id3 будет несколько первоуровневых рефералов:
    у id19 (1ур - 20,21,23, 2ур - 25,35,36)
    у id28 (1ур - 33,37, 2ур - 82,88,95,96)


    [0]=> "3", [1]=> "19,27,28", [2]=> "20,21,23,48,54,33,37", [3]=> "25,35,36,55,56,59,82,88,95,96", ...

    Пробовал просто через циклы, но не то. Если наследственность рефералов будет в несколько десятков и сотен - под каждый уровень писать цикл даже для меня извращение. Буду признателен подсказкам, примерам и особенно примерам с комментариями.