#php #mysql #алгоритм
Хочу реализовать партнерскую программу на сайте в восемь уровней вложенности но не знаю как можно такое реализовать с помощью php и MySQL. Принцип работы такой: если пользователь A привел пользователя B то А становится его рефералом и его уровень 1, а если пользователь B привел пользователя С то B становится его рефералом и его уровень 2 для пользователя А и 1 для пользователя Б, но если А приведет D то А становится его рефералом и его уровень 1 и так до восьмого уровня вложенности пользователей. Надеюсь суть поняли. Но потом мне нужна ка-кто их выводить из БД и для каждого пользователя отображать их уровент вложенности на пример: если пользователь А то: B - 1 уровень D - 1 уровень С - 2 уровень а если пользователь B то: C - 1 уровень
Ответы
Ответ 1
Есть несколько популярных методов представления древовидных данных в БД: Adjacency List, Materialized Paths, Nested Sets. У каждого есть свои плюсы и минусы. Выбор за вами, в зависимости от вашей конкретной специфики. Если данные будут добавляться нечасто, а вычисление "уровня" это типичный кейс, то я бы рекомендовал Nested Sets. См. слайдшоу с кратким описанием ключевых моментов каждой из техник: http://www.slideshare.net/quipo/trees-in-the-database-advanced-data-structures (На стр. 66 как раз пример вычисления уровня для всех записей NS одним SQL-запросом.) -- Партнеры, организованные в структуру Nested Sets CREATE TABLE partners ( user_id INT(10) NOT NULL PRIMARY KEY, lft INT(10) NOT NULL, rgt INT(10) NOT NULL ); -- Вычисление уровня для записи :id (уровни нумеруются с 1) SELECT p2.user_id, COUNT(p1.user_id) AS lvl FROM partners AS p1 JOIN partners AS p2 ON p2.lft BETWEEN p1.lft AND p1.rgt WHERE p2.user_id = :id http://sqlfiddle.com/#!9/3f76f/9 - уровень для конкретной записи http://sqlfiddle.com/#!9/3f76f/10 - уровни для всех записейОтвет 2
Три столбца: Id, int, primaryKey ParentId, int (null если сам пришёл) ChildIds, varchar. Массив id рефералов, разделённых запятой. Добавлять реферала записью ChildIds=ChildIds.",".Id; Где Id - это ид нового юзера. Узнать всех рефералов просто перебрав Id из ChildIds Проследить с любого уровня до верху - запрашивать ParentId пока он не null. P.S. Это может быть велосипед и не нормальная форма БД, но работать будет же.Ответ 3
если нужно только количетство тогда пример @artoodetoo отличный. но если нужно создать эту системы и также отображать своих пользователей, нужно немного развить таблицу. Есть 2 метода разбиение уровни. * У каждого реферала по 2 пользователя * У каждого реферала по несколько пользователей если вариант 1й тогда таблица имеет вид CREATE TABLE users ( user_id INT(10) NOT NULL PRIMARY KEY, referrer_id INT(10), referrer_side char(1) DEFAULT 'N', left_user_id INT(10) NOT NULL, left_count INT(10) NOT NULL, right_user_id INT(10) NOT NULL, right__count INT(10) NOT NULl, is_active char(1) DEFAULT 'A' ); INSERT INTO users VALUES (1, 0, 2, 0, 3, 0, 'A'), (2, 1, 2, 0, 3, 0, 'A'); тут легче передвигатся между уровнями и пользовательями user_id - сам пользователь referrer_id - его реферал, если нету 0 referrer_side - с какой стороны стоит пользовател у реферала left_user_id - пользователь по левой стороне left_count - число пользователей в левой части right_user_id - пользователь по правой стороне right__count - число пользователей в правой части is_active - пользователь Активный(A) или Удалень (D) При добавлении нового пользователья, вам нужно пройтись по referrer_id и увеличить их количество пользователей (до 7 уровней). При удалении тоже самое. Только при удалении нужно вам подумать что делать и его пользовательями. Само дерево можно составить с циклами до 8. если 2й вариант тут число пользователей у реферала не ограничено, придется создать допольнительно таблицу для всязок. Но думаю у Вас задача не такая Думаю поможет.
Комментариев нет:
Отправить комментарий