2015-06-14 59 views
0

我正在制作一款游戏,其中涉及人们下载和评分用户创建的地图。如果他们喜欢/不喜欢它,他们可以选择投票/降低地图的投票率,也可以评估1-10分的难度。按首选平均值排序

在地图浏览器中,他们可以选择按照最高评分排序地图。这是通过使用Laplace smoothing来完成的,因此它将upvotes的数量以及评分的总数都归入排序,按(upvotes + 1)/(numRatings + 2)排序。这工作正常。

现在,还可以选择按首选难度排序,人们可以从1-10中选择一个值,然后按平均难度等级与优先等级的接近程度排序地图。起初,我按ABS(preferred_difficulty - average_difficulty)排序,但这并不影响收视率。现在我使用((numRatings + 1) * (10 - ABS(average_difficulty - preferred_difficulty)) + 1)/(numRatings + 1.5)出于纯粹的试验和错误,这有点有用,但有时评级的数量超过了首选的难度,结果看起来很奇怪。

这是我需要帮助的 - 我无法弄清楚如何根据首选难度和平均难度之间的最小差异进行排序,同时将多个评分纳入混合中,因为我想要一个具有较高评分数的低难度三角洲最好的结果,而不是一个高评分计数的高点数,就像评级一样。

例如,如果是这样的数据:

AvgDifficulty  NumRatings 
     6.0     1 
     4.0    25 
     6.8     4 
     6.2     3 
     6.5    20 
     6.2     1 
     6.4     3 

而有人选择6.4优选的困难,我希望它排序是这样的:

AvgDifficulty  NumRatings 
     6.5    20 
     6.4     3 
     6.2     3 
     6.8     4 
     6.2     1 
     6.0     1 
     4.0    25 

基本上我想结果与顶部的首选难度接近,但我宁愿显示0.1分关闭的结果,以及很少评分的精确匹配评分。我知道在这种情况下,获得“正确”结果可能不是很具体,我只是寻找一个起点。

感谢您的帮助!

+1

请编辑您的问题,并提供样本数据和所需结果(在问题的表结构中)。没有例子很容易误解这种长时间的解释。 –

+0

@GordonLinoff添加了一个示例。 – user3413457

回答

0

你有点含糊不清的问题。你需要一些方法来结合评分和计数。基本查询是:

order by abs(avg_difficulty - 6.4) 

但是,您还想包括计数。你可以在上面定义了一个固定的乐队,由顺序排名这些:

order by (case when abs(avg_difficulty - 6.4) < 0.1) then numratings end) desc, 
     abs(avg_difficulty - 6.4) 

这个表达式结合一切从6.3 - 一组6.5和收视率的数量排序这些。第二个关键点按其差别排序。