2 голоса
 
77 просмотров
7.01.2021 / 22:06  Macabre

Как реализовать подсчёт рейтинга статьи?

Здравствуйте, собираюсь написать скрипт рейтинга статьи на пхп, но не пойму как правильно сделать. Создал таблицу бд, куда записываются все голоса. Но как вывести общий рейтинг (общее число голосов деленное на количество проголосовавших)?
Также будет топ голосов, поэтому общий рейтинг статьи надо писать в ячейку, а не выводить методом подсчета на лету.
Изм. aNNiMON от 7.01.2021 / 23:28
Ответы
 
1 голос
 
# 8.01.2021 / 13:38  aNNiMON
Рейтинг можно и сразу подсчитать.

К примеру, есть такая структура:
  1. articles:
  2.   id : int
  3.   ... // другие поля
  4. article_votes:
  5.   article_id: int // id статьи
  6.   user_id: int // id юзера
  7.   value: int // рейтинг 1-5

Тогда, запрашивая статьи, можно сджоинить таблицу голосов, посчитать рейтинг и тут же отсортировать:
  1. SELECT articles.*,
  2.   COUNT(article_votes.value) as votes_count,
  3.   COALESCE(SUM(article_votes.value) / COUNT(article_votes.value), 0) as rating
  4. FROM articles
  5. GROUP BY articles.id
  6. ORDER BY rating DESC, votes_count DESC

COALESCE нужен для ситуаций, когда голосов для статьи ещё нет, в таком случае результат деления на 0 даст NULL и COALESCE превратит его в 0.

А votes_count может пригодиться для дальнейшего вывода, чтобы потом не запрашивать.
Изм. aNNiMON от 8.01.2021 / 13:40
 
1 голос
 
# 8.01.2021 / 10:15  Витаминыч
Агрегатные функции посмотри. И вычисления в where.
 
1 голос
 
# 8.01.2021 / 08:37  Death
Что-то ты явно усложняешь. Разве a - b не решение для самого рейтинга одной статьи? Где a - положительные, а b - отрицательные голоса. В базе данных(если sql), можно составить запросы, который будет это число на ходу вычислять для возвращаемой записи. И так же там можно произвести другие операции, но уже со всеми статьями, например, всех одного пользователя, одной темы, одних тэгов даже. Или ещё что странее, в тексте находить слово, если есть такое слово, то берём его плюс и минус, получаем из них среднее, и их складывать.

Уточни моменты некоторые, если я не так понял
8.01.2021 / 09:09  Macabre
Интересует рейтинг такого плана: юзер голосует по 5 бальной шкале и потом выводится средний балл от общего числа голосов. Например, три юзера поставили оценку 5 и средний балл будет 5. Ну вообще я придумал реализацию.
Будет таблица с голосами для отслеживания кто и сколько голосов отдал. Кроме того, в таблице где лежат статьи сделаю два новых поля: общее число голосов за статью (все голоса будут суммироваться) и количество проголосовавших. После этого выводить топ с сортировкой по общему числу
8.01.2021 / 09:10  Macabre
голосов. А именно средний балл высчитывать непосредственно в цикле путём математических операций с этими двумя ячейками.
Всего: 3

Реклама

Мы в соцсетях

vk tw tg yt