Всем привет! Нужно на отдельной странице выводить топ 50 пользователей за месяц, за все время. Как в отдельной категории, так и за все категории.
А теперь подробнее.
Сайт еще в стадии разработки, для меня это первый проект на laravel. Поэтому прошу помощи у пользователей Тостера, не обязательно кодом, можно и просто расписать логику. Я даже представить себе не могу как реализовать эту функцию.
У каждого пользователя(table users) есть свои новости(table news), которые он ежедневно добавляет. После проверки администрацией каждой новости присваивается в поле status число. Если 1, то пользователю дается рейтинг +50. Если 2, то -30. Если 3, то не изменяется рейтинг.
Нужно выводить топ пользователей за месяц и за все время, в каждой категории(table categories) и во всех категориях вместе.
Как правильно осуществить этот рейтинг? Помогите с логикой рейтинга. А если еще и код подкинете, буду безмерно благодарен.
Вы бы сначала начали решать эту задачу "на бумажке" чисто логику расписать, посмотрели бы примеры существующих решений, а потом уже конкретные вопросы задавать.
Сейчас это больше тянет для биржы фриланса.
Konata Izumi, примеры к сожалению я не нашел. Я и написал, что логику не могу составить.
Мне кажется что перебирать все новости при каждом обновлении страницы и составлять рейтинг не очень хорошая практика. Поэтому и попросил помощи у Тостера.
Nikita Kravchenko, таблица с рейтингом создаётся по твоему усмотрению и логику апдейтов делаешь как душе угодно. Можешь ввести одно поле месячного рейтинга и обнулять его каждый месяц + год, можешь ввести 12 полей месяца
Павел Лебедев, интересное решение, спасибо. Если ничего лучше не найду, сделаю именно так.
Я хотел еще делать пересчет рейтинга. Если вдруг новость удалят. Либо произойдет что-то другое.
А так же я планировал за месяц. В плане не обнулять каждый месяц. А за последние 30 дней(не правильно выразился изначально)
Павел Лебедев, уточни пожалуйста, ты имеешь ввиду что под каждого пользователя делать отдельную строку и там менять значение? Или каждое изменение рейтинга, это новая строчка?
Nikita Kravchenko, под каждого юзера своя строка. Но реализация с таблицей рейтинга не лучшее решение, если не планируешь проект держать больше года, т.к. проблематично делать переход на новый год. Лучше смотри в строну запроса по таблице новостей и считать рейтинг запросом
Nikita Kravchenko, нет. Один запрос, который тебе даст топ 50 по рейтингу новостей. Меняя условие в where ты можешь выбирать и по диапазону месяца, года и как захочешь
select
`id_user`
,sum(case when `status` = 1 then 50 else 0 end) - sum(case when `status` = 2 then 30 else 0 end)
from news
WHERE MONTH(`date`) = 3 AND YEAR(`date`) = 2019
group by 1
order by 2 desc, 1 asc
LIMIT 50
select
`id_user`
,sum(case when `status` = 1 then 50 else 0 end) - sum(case when `status` = 2 then 30 else 0 end)
from news
WHERE MONTH(`date`) = 3 AND YEAR(`date`) = 2019
group by 1
order by 2 desc, 1 asc
LIMIT 50