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

时间:2018-01-11 16:43:19

标签: mysql algorithm ranking

我正在开发一个新网站,其中有一些“实体”可以投票。

每次投票都可以是1到5之间的数字,其中1是最差投票,5是最佳投票。

现在,在同一个网站上,我有一个“热门实体图表”,我根据他们的投票列出了最受欢迎的“实体”。

现在,我不能做一个简单的算术平均值,因为一票5的“实体”可能与100个5票的“实体”具有相同的排名。

我考虑过存储每个“实体”而不是算术平均值,而且还有投票数和执行SQL查询,我按照投票数和算术平均数进行排序但似乎在此之后,有多个投票的实体1可以流行(当它不受欢迎时)。

我可以使用什么算法?

1 个答案:

答案 0 :(得分:1)

对于一个基本的解决方案,试试order by [average vote] desc, [vote count] desc这两种具有相同平均值的实体,100票的票数将高于1票,但平均值为4.5的票将永远不会高于1票。平均为5.

修改1

如果你希望 100投票平均值4.5赢得10投票平均5,为什么不计票忽略1,2和3,或[票数4和5] - [计数]第1和第2票]?这样,投票的数量会使实体在排名中上升。

修改2

您可能希望对最近的投票给予特别重视。关于改变用户意见的实体可能会有所改变。可以建立上个月的另一次平均投票,并根据它调整最终排名。

编辑3

如何计算[popularScore]列并按其排序?

-- 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

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