Не нравятся результаты поиска? Попробуйте другой поиск!
dle-faq.ru FAQ (все вопросы) Хаки Рейтинг новости DLE

Рейтинг новости DLE


     06.04.2014    Хаки    2942

вопрос
Доброго времени суток всем читающим!

В общем на сайте реализован топ новостей (песен) из определённой категории. (через {custom})

Сортировка идёт по рейтингу

Но возник маленький неприятный момент, когда добавляешь новую новость (песню в топ) ей ставят 5 звёзд она висит внизу рейтинга.


С Blockpro такая же беда.

Ответил: Sander


Краткий курс ликбеза и описание несовершенства алгоритма.
Откроем файл topnews.php и посмотрим на сам запрос:
$db->query( "SELECT p.id, p.date, p.short_story, p.xfields, p.title, p.category, p.alt_name FROM " . PREFIX . "_post p LEFT JOIN " . PREFIX . "_post_extras e ON (p.id=e.news_id) WHERE p.approve=1 AND p.date >= '$this_month' - INTERVAL 1 MONTH AND p.date < '$this_month' ORDER BY rating DESC, comm_num DESC, news_read DESC, date DESC LIMIT 0,{$config['top_number']}" );

Уберем все лишнее, не относящееся к делу и что мы получим:
WHERE p.approve=1 AND p.date >= '$this_month' - INTERVAL 1 MONTH AND p.date < '$this_month'

С условиями WHERE все и так понятно, берутся все новости прошедшие модерацию и дата публикации которых строго не старше месяца.
ORDER BY rating DESC, comm_num DESC, news_read DESC, date DESC

Теперь сортировка. Первый же параметр, он же основной - rating. Остальные в нашем случае особо большой роли не играют.
Чтобы понимать как работает сортировка по рейтингу - надо понимать как устроен этот самый рейтинг.
Для хранения и отображения рейтинга, DLE использует 2 поля: rating и vote_num.
Таким образом, в поле rating записывается сумма всех оценок проголосовавших, а vote_num само количество голосов. Очень надеюсь, что с курса средней школы никто не забыл как считается среднее значение :)
Вот например, проголосовало 5 человек, оценки разные:
( 5+3+4+1+1 ) / 5 = 2.8

Округляя число, получается рейтинг статьи 3 звезды. Однако в поле rating хранится число 14, а в поле vote_num - 5. И вот сортировка топ-блоков происходит только по значению поля rating, без учета vote_num.
И вот следуя из этого и получаются подобные ошибки. Т.е. есть какая-либо новость, за которую проголосовали 100 человек, причем оценки всех людей были 1 или 2 балла. Т.е. значение поля rating будет в пределах 100-200.
И есть еще одна новость, за которую проголосовали 20 человек, только оценки были преимущественно 5 баллов и поле rating будет хранить значение строго не превышающее 100 баллов. А это меньше чем у новости, которую "заминусовали". Вот так и получится, что новость у которой мы видим 1 балл в топе выше чем новость у которой 5 баллов. Если вы все еще это читаете, то как вариант можно попробовать заменить в запроса rating на rating/vote_num
Но если посмотреть с другой стороны. Это блок популярных новостей. А новость, за которую проголосовало более 100 человек - определенно можно считать популярной.
Ну вот как-то так :)
Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы