基于1-5投票的人气排名算法

vuv7lop3  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(407)

我正在开发一个新网站,里面有一些“实体”可以投票。
每一票可以是1到5之间的数字,其中1是最差票,5是最好票。
现在,在同一个网站,我有一个“热门实体图表”,其中我列出了最受欢迎的“实体”根据他们的投票。
现在,我不能做简单的算术平均,因为一个5票的“实体”可能和一个5票100票的“实体”有相同的排名。
我想为每个“实体”存储的不是算术平均数,而是投票数,并做了一个sql查询,我按投票数和算术平均数排序,但似乎在这之后,一个拥有1的许多投票数的实体可以得到流行(当它不流行时)。
我可以使用什么算法?

cidc1ykv

cidc1ykv1#

要找到基本解决方案,请尝试 order by [average vote] desc, [vote count] desc 这样,在平均数相同的两个实体中,获得100票的实体将高于获得1票的实体,但平均数为4.5的实体将永远不会高于平均数为5的实体。
编辑1
如果你想让100票的平均票数4.5比10票的平均票数5获胜,为什么不忽略1、2和3进行计票,或者[计票4和5]-[计票1和2]?通过这种方式,赞成票的计数将提高实体的排名。
编辑2
你可能想对最近的投票给予额外的重视。某个实体可能发生了某些变化,从而改变了用户对它的看法。可能会建立上个月投票的另一个平均值,并在此基础上调整最终排名。
编辑3
计算一个[popularityscore]列并按它排序怎么样?

-- sum instead of average
-- square root of sum will reduce importance of vote count a bit
select
    entity,
    sqrt(sum(vote - 3)) as popularityScore
from Votes
group by entity
order by rank desc

-- 50 votes of 5 -> popularityScore = 12.25
-- 100 votes of 4 -> popularityScore = 10
-- 200 votes of 4 -> popularityScore = 14.14
-- 2000 votes of 4 -> popularityScore = 44.72
-- 2000 votes of 5 -> popularityScore = 63.25
-- 100000000 votes of 3 -> popularityScore = 0

可以计算上个月的相同分数并将其添加到此值中。

相关问题