我们有一个包含地方数据库的网站。对于每个地方,我们的用户都可以采取我们记录的以下操作之一:
在我们的数据库表中,每个地方都包含上述每项操作的次数以及用户给出的平均评分。
我们希望能够使用上述信息生成顶级位置列表。理想情况下,我们希望能够使用相对简单的SQL查询生成此列表,而无需执行任何计划来计算其他字段或堆栈排名位置。话虽这么说,因为我们只有大约50,000个地方,我们可以运行夜间cron工作来计算一些字段,例如不同类别的排名,如果它会对我们的顶级位置的整体结果产生有意义的差异。
如果你能就如何考虑将最好的地方冒泡到顶部,我们应该考虑哪些标准,我们应该更重要,并给出这些信息 - 建议MySQL查询需要看起来像为了选择前10名。
有一点需要注意的是,目前我们并不关心一个受欢迎的地方的新近度 - 这意味着查看总体信息很好,而且最近的数据不需要加权更多。 / p>
提前感谢您的帮助&咨询!
答案 0 :(得分:12)
答案 1 :(得分:2)
喜欢的确切公式需要来自你,我们称之为f(x) 对于实际的实现,我会添加一个我将计算的popular_score字段,正如你在夜间cron作业中所说的,每行使用f(x)。
然后,这只是一个“通过popular_score desc从表顺序中选择地名”的情况。
好的 - 让我们试一试吧 popular_score =(最喜欢* 3 +已完成* 2 + WISHLIST)*评分*视图/ AVG_VIEWS_OF_ALL_PROFILES
答案 2 :(得分:1)
我对如何称量事物没有意见。
那就是说,为什么不直接在位置表中添加一个人气栏?突然之间,您的SQL查询非常简单。
当然,棘手的部分是弄清楚如何以及何时更新该值。但是,由于您要保存所有活动数据,因此始终可以从日志条目中重新生成流行度值。
这样,你可以快速查询“最受欢迎”的位置,如果你想改变计算流行度的方式,你可以随意这样做。
如果你很聪明,你可以设计一个足够简单的公式,以便实时跟踪受欢迎程度。例如,如果我们只关心平均评级,您可以仅用三个变量修改平均评级:当前平均评级,评估对象的次数以及新评级值。
当然,当您开始混合对象被查看,审阅,收藏等多少次时,事情变得更加复杂......但是您可能会发现您可以设计一种计算上足够便宜的方法,您可以更新几乎所有行动的整体受欢迎程度。