我有一个包含以下内容的数据库:
user_id | category_id | liked_id | disliked_id
(感谢堆栈溢出用户帮助我首先正确设置数据库!!) 上次我以食物为例,但这次我要用人。
用户被给予2个图像(男性对男性或女性对女性)并且他/她只是选择他/她认为哪个更有吸引力。只要他/她愿意,用户就重复这个过程。每个选项都会输入到数据库中,显示他们喜欢哪个人以及他们不喜欢哪个人(如果您认为这两个人相似,也可以使用按钮)。
现在我的表格已经满了条目,我正在尝试开发一种算法,将所有这些“投票”并将其转换为用户最有吸引力的排名列表(基于数百或者可能)甚至成千上万的排名条目。)
我已经在绘图板上呆了几个小时,似乎无法想到这样做的有效方法。
任何帮助都将不胜感激。
P.S。:这个想法也是为了让这个用户成为一个多用户的东西,其他用户可以看到你的“喜欢”的表格,并且还有全球平均的表格,显示所有用户一般如何排名。
答案 0 :(得分: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