【问题标题】:Weighted vote handling for RDBMSRDBMS 的加权投票处理
【发布时间】:2012-12-13 19:26:32
【问题描述】:

我的 RDBMS(通常是 MySQL 或 Postgresql)中有三个表,我想在计算投票时使用它们。第一个是用户表,其中用户有不同程度的拉动(权重),第二个是记录他们对项目的投票的表,第三个是项目表本身。

这个想法是版主或使用时间较长的用户在投票时应该有更大的“权重”。

USER {
    id,
    weight int,
}

VOTE {
    vote int,
    user_id,
    item_id,
}

ITEM {
    id
}

除了投票数之外,我还想根据用户投票的权重来计算项目的投票。因此,如果用户 100 和 101 的权重均为 1,并且投票得分为“3”,而权重为 10 的用户 102 出现并投票“5”,那么我们会为该用户 102 的投票分配更多价值。

也许是一些简单的事情,比如所有用户的总用户权重被用来划分选票。

(user:weight * vote) / sum(user:weight))

也许我应该使用其他公式来曲线系统中权重最大的用户的力量。

如何在考虑第三个变量(例如用户的权力)的情况下计算投票?

对于那件事,我应该如何计算重量?也许我可以将所有用户的总权重相加,然后除以用户总数,找到一个平均权重,我可以使用该平均权重为用户赋予 1 到 100 之间的权重,这样更容易使用。

【问题讨论】:

  • 恕我直言,这对 SO 来说不是一个有效的问题
  • 您的权重公式似乎是正确的,但我会使用 100 作为默认值,以便整数可以比整数乘数更好地区分用户。 -- 关于第三个参数:你能解释一下你使用的“权力”这个概念吗?这与“重量”的概念有何不同?
  • @Lewyx,我只是指拥有更多“重量”给用户带来的力量——没有其他区别。

标签: mysql sql algorithm vote weighted-average


【解决方案1】:

您可以在聚合中进行算术运算:

select v.item_id,
       (case when sum(u.weight) > 0 then sum(u.weight * v.vote) / sum(u.weight) end) as weightedVote
from vote v join
     user u
     on v.user_id = u.id
group by v.item_id

如何计算权重是另一回事。该查询显示了如何使用它们。

【讨论】:

    猜你喜欢
    • 2011-05-06
    • 2013-09-26
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2014-11-07
    相关资源
    最近更新 更多