按首选平均值排序

时间:2015-06-14 13:35:09

标签: mysql sorting

我正在制作一款涉及人们下载和评级用户创建的地图的游戏。如果他们喜欢/不喜欢它,他们可以选择对地图进行upvote / downvote,并且可以在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)纯粹的试验和错误,这有点有效,但有时收视率超过首选难度,结果看起来很奇怪。

这是我需要帮助的 - 我无法弄清楚如何将首选和平均难度之间的最小差异排序,同时将评分数量合并到混音中,因为我想要一个具有高评级数的低难度delta是最好的结果,而不是具有高评级数的高upvote数,就像评级一样。

例如,如果这是数据:

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 :(得分: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中的所有内容组合在一个组中,并按评级数对其进行排序。第二个键按其他方式排序其他所有内容。