0

我有一个数据库,其中包含:

user_id | category_id | liked_id | disliked_id

(感谢堆栈溢出用户首先帮助我正确设置了我的数据库!!)上次我以食物为例,但这次我将使用人。

给用户两张图片(男性对男性或女性对女性),他/她只需选择他/她认为更有吸引力的一张。用户只要他/她愿意就重复这个过程。每个选择都输入到数据库中,显示他们喜欢和不喜欢的人(如果您认为两者相似,也可以使用按钮)。

既然我的表里满是条目,我正在尝试开发一种算法,它将所有这些“投票”转化为用户认为最有吸引力的人的排名列表(基于数百甚至数千排名条目)。

我已经在绘图板上工作了几个小时,似乎想不出一种有效的方法来做到这一点。

任何帮助,将不胜感激。

PS:这个想法也是让它成为一个多用户的东西,其他用户可以看到你的“喜欢”表,并且还有全局平均表,显示所有用户对事物的总体排名。

4

1 回答 1

0

因此,您在 c# 组中发布了您的问题。但是,我想为您提供一个在数据库中实现的解决方案,使其更加独立于您的程序。

您可能首先要做的是获取图像被喜欢和不喜欢的次数。该 SQL 语句应该为您执行此操作(如果您使用支持分组集的数据库,它可能更容易编写):

SELECT t1.liked_id as id, t1.c_liked, t2.c_disliked
FROM 
    (SELECT liked_id, COUNT(*) as c_liked FROM table GROUP BY liked_id) t1
LEFT JOIN
    (SELECT disliked_id, COUNT(*) c_disliked FROM table GROUP BY disliked_id) t2
ON
    t1.liked_id = t2.disliked_id

然后由您决定如何处理这些数字。在最外层的 SELECT 语句中,您可以放置​​一个非常复杂的函数,例如,您可以选择对不喜欢的权重小于对喜欢的权重。为了让您了解一个可能的非常简单的功能:

SELECT t1.liked_id as id, 
(t1.c_liked/(t1.c_liked + t2.c_disliked) -  t2.c_disliked/(t1.c_liked + t2.c_disliked)) as score

这将为您返回值 [-1, 1] (如果您愿意,您可以将其标准化为 [0, 1],但不必这样做),然后您可以按照以下示例对其进行排序:

SELECT t1.liked_id as id, 
    (t1.c_liked/(t1.c_liked + t2.c_disliked) -  t2.c_disliked/(t1.c_liked + t2.c_disliked)) as score    
FROM 
    (SELECT liked_id, COUNT(*) as c_liked FROM table GROUP BY liked_id) t1
LEFT JOIN
    (SELECT disliked_id, COUNT(*) c_disliked FROM table GROUP BY disliked_id) t2
ON
    t1.liked_id = t2.disliked_id
ORDER BY score
于 2013-02-20T10:06:16.953 回答