Создание системы ожидания и повторного рейтинга пользователей - PullRequest
0 голосов
/ 01 января 2019

Итак, вот моя проблема, я работаю над системой листинга ожидания для приложения.Пользователь подписывался, чтобы получать уведомления, когда мы запускаем, и предлагал реферальные ссылки, чтобы помочь «увеличить» свое место в списке ожидания.

Проблема, с которой я столкнулся, заключается в том, как мне ранжировать их в MySQL илиБаза данных NoSQL.Проблема, с которой я сталкиваюсь, заключается в следующем: если моя база данных выглядит следующим образом:

User  | Ranking | Invited
-------------------------
user1 |    1    |    0
user2 |    2    |    0
user3 |    3    |    0
user4 |    4    |    0
user5 |    5    |    0
user6 |    6    |    0
user7 |    7    |    0
user8 |    8    |    1

Теперь, предполагая, что user8 теперь приглашает 1 друга.Они поднимаются до вершины, но как мне сортировать эти данные?Хорошо переупорядочить всю таблицу так:

User  | Ranking | Invited
-------------------------
user1 |    2    |    0
user2 |    3    |    0
user3 |    4    |    0
user4 |    5    |    0
user5 |    6    |    0
user6 |    7    |    0
user7 |    8    |    0
user8 |    1    |    1

Но не очень удобно, если записи превышают несколько сотен.Может быть, я не смотрю на эту проблему правильно?Там должно быть более простое решение?Любые указатели или помощь приветствуется!Спасибо.

1 Ответ

0 голосов
/ 01 января 2019

Если вы хотите, чтобы рейтинг основывался на том, кто пригласил больше людей, и, если число приглашений одинаково, их первоначальный ранг, просто отсортируйте их так, когда читаете таблицу:

select user from waitlisttable order by invited desc, ranking;

Если вам нужен такой порядок в каком-то более крупном запросе, вы можете создать для него представление, но на самом деле обновления ранжирования для всех существующих записей определенно следует избегать.

Если вы хотите получить «ранг» для всехпользователи, см. Как отобразить порядковый номер в результате запроса MySQL .

Если вам действительно нужно иметь возможность искать звание одного пользователя, то вам, вероятно, нужно обновить все строки;в зависимости от того, насколько тяжелой является ваша нагрузка, вы будете делать это каждые X минут на каком-либо задании или каждый раз, когда строка обновляется с помощью триггера.Простой пример выполнения первого будет:

set @rank:=0;
update waitlisttable set ranking=(@rank:=@rank+1) order by invitations desc, initial_ranking;
...