За последние 24 часа нас посетили 17159 программистов и 1265 роботов. Сейчас ищут 1830 программистов ...

Принцип работы пирамиды

Тема в разделе "PHP для новичков", создана пользователем Bueno, 20 мар 2014.

  1. Bueno

    Bueno Активный пользователь

    С нами с:
    30 окт 2007
    Сообщения:
    73
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Помогите разобраться

    Есть задача сделать пирамиду по типу один юзер привел второго а второй третьего и.т.д
    Проблема заключается в том что каждый из этих юзеров может заработать очки за какие-то действия, например
    если ю.2 заработает 10 очков то ю.1 получит одно очко а если ю.3 заработает 100 то ю.2 получит 10 а ю.1 одно очко.

    Зарабатывать они могут как по 1 так и по 2 и по 5 очков за раз.

    В базе юзеры хранятся в таком виде:

    Код (Text):
    1.  
    2. id | u_id | r1 | r2 | r3 |
    3. 1     1      2    3    4
    4. 2     2      3    4
    5. 3     3      4
    Все это работает т.е. я могу посмотреть кто кого привел и.т.д. но не могу догнать как узнать что ю.3 заработал 100 чтобы выдать остальным очки, пож. помогите, как это можно реализовать? Как хранить эти очки чтобы можно было видеть разницу между всеми юзерами?

    Спасибо.
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Я бы поступил по другому (я не профессионал, по этому не стоит рассматривать мое решение как идеал), я бы разбил на 2 таблицы, первая пользователи, в ней бы не было кто кого привел, но были бы заработанные баллы.
    А вот во второй там всего 3 столбца: ID, имя пользователя и кого привел.

    допустим пользователь с очень редким ником Alex привел троих, это бы выглядело в БД так:

    Код (Text):
    1. id | user | follower
    2. ............................
    3. 15 | Alex | Max
    4. 16 | Alex | Voland
    5. ............................
    6. 25 | Alex | user1999
    если тебе надо посмотреть кого привел Alex, просто делаешь что бы тебе выдало все записи где user = 'Alex', примерно как то так.
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.102
    Симпатии:
    1.243
    Адрес:
    там-сям
    упрощаем вычисления: тот кто на самом верху забирает всё.
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    Принцип пирамиды - многократный развод лохов, а структура не имеет значения
    http://lenta.ru/news/2014/03/20/mmm11/
    Я чуть не прослезился, пока читал.
     
  5. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Что вы так накинулись на пирамиду, кто то выигрывает, кто то проигрывает, все знают на что идут.
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    Но баллы надо зачислять не тем, кого привел Alex, а наоборот: Alex должен получать баллы от тех, кого он привел, когда они получают балы. И еще он должен получать баллы от тех, кого привели те, кого привел он.
    С фиксированным количеством реферальных уровней (например, три), оптимальнее одна таблица с несколькими полями, а не список связей, тем более, что "хозяева" не меняются. Зачем пересчитывать заново при каждом пополнении баланса, если можно посчитать однажды - при регистрации? Я не знаю, что автор имел ввиду под полями r1, r2, r3, но пускай будет r3 - это хозяин Алекса, а r2 - хозяин хозяина Алекса, а r1 - Мавроди. Теперь, когда Алекс получит 1000 баллов, его r3 мы зачислим 100, r2 - 10 и 1 Мавроди.
    Если вдруг Алекса пригласил чел, хозяин которого сам Мавроди, то r1 у Алекса будет пустым полем, Мавроди - в r2. Это нужно посчитать только при регистрации, после чего структура будет как на ладони.
     
  7. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Но разве в той таблице что я привел нельзя это реализовать, допустим Max заработал 100 баллов, я делаю запрос в базу, ищу запись где follower='Max', должна найтись всего одна запись (id 15), и от туда беру что что user='Alex', что значит что Alex надо зачислить 10 баллов, потом делаю еще запрос в БД где я ищу запись follower='Alex' т.е. я ищу того кто привел Alex да бы зачислить ему 1 балл.

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

    Но мне все же первый вариант нравится больше, он более понятный, логичный и вообще.
     
  8. Bueno

    Bueno Активный пользователь

    С нами с:
    30 окт 2007
    Сообщения:
    73
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Всем спасибо за ответы! Проблему решил.
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Нет, не знают. Они знают то, что им сказали. Они не думают. Они барашки.

    И да, автор, почитай, полезно http://www.rg.ru/2012/11/13/proekt-fin-piramid-site-dok.html