关于可移动加权的数据库项目排名

时间:2015-07-08 19:09:31

标签: mysql database aggregate-functions quartile

所以我认为这是一个非常独特的问题。我需要计算一个非常大的项目(200,000ish)的排名。他们的排名'基于几个加在一起的加权属性。 1-4个等级上的7个属性(基于它们的四分位数1底部四分位数4顶部)每个最初均等加权然后加在一起(7-28比例)。我想允许用户调整属性的权重,使其中的任何一个或全部重要一倍或一半。这可能会改变他们的最终排名。 我希望看看是否有人遇到过类似的问题,或者对于从哪里开始有任何想法。谢谢!

2 个答案:

答案 0 :(得分:0)

作为一个基本设计,我会尝试制作你的原始物品,以及它们的默认排名不可变。

然后,您在cron上运行脚本,以计算其间隔的排名。这可以通过您选择的某种算法来完成,但仅作为示例:

让我们说一个项目具有以下属性 { “someRetailListing”:{ “id”:“1”, “价格”:“100000.12”, “城市”:“纽约市”, “房间”:“4”, ... “rankCity”:4, “rankPrice”:3, “rankQuality”:3 } 您的脚本第一次运行时,其总排名为20/30

现在,用户出现并添加他的输入,并将他的提交保存在一个单独的存储桶中(或者在同一个存储桶中使用类型): { “类型”: “userRank” “uid”:3121, “propertyID”:1 “rankCity”:3, “rankPrice”:1, “rankQuality”:3 } 当您运行脚本时,您可能希望50%的排名来自用户,50%来自默认排名。因此,您可以将所有用户结果汇总在一起,获得平均用户分数,然后与您合并,然后做任何您喜欢的事情。

你保存这个最终结果 { “type”:“userPropertyRank”, “propertyID”:1 “rankCity”:3, “rankPrice”:3, “rankQuality”:3 }

答案 1 :(得分:0)

排名的基本结构是带变量的排序查询。您只需将用户输入纳入排名。

查询看起来像这样:

select t.*, (@rn := @rn + 1) as ranking
from (select t.*, (@v1 * col1 + @v2 * col2 . . .) as ranking
      from table t
     ) t cross join
     (select @rn := 0) params
order by ranking;

您可以在数据库中轻松完成此操作;你只需传递正确的变量。