我正在尝试使用以下架构找到具有类似兴趣集的用户..
USERS - ID name etc
Interests - ID UID PID
其中ID是兴趣的唯一ID,UIS是用户ID,PID是产品ID。我在SO看了其他类似的问题,但没有一个有确切的答案。
示例 - 假设我有兴趣让用户对John有类似的兴趣,这就是两个表格看起来像......
ID Name
11 John
12 Mary
13 Scott
14 Tim
ID UID PID
3 12 123
4 12 231
5 12 612
6 13 123
7 13 612
8 14 931
9 14 214
10 11 123
11 11 231
12 11 781
13 11 612
我希望按顺序得到一个结果。
我正在考虑与所有其他用户进行我感兴趣的用户的集合交集。它听起来不是一个非常好的解决方案,因为每次用户增加兴趣或添加其他用户时都必须这样做。它是一个小项目,到目前为止我将限制用户为100.我仍然认为上述方法根本不会有效,因为它需要100 2 时间。
有人可以指导我朝正确的方向发展吗?有哪些可能的解决方案,哪一个在上述限制条件下最好。我正在查看ANN,看看我是否可以使用它。
答案 0 :(得分:2)
首先计算每个用户与John的共同兴趣点数量。方法是采取约翰的所有利益,加入利益表并汇总到共同利益的数量。这是SQL的代码:
select i.uid, COUNT(*) as cnt
from (select i.*
from interests i join
users u
on i.uid = i.id
where u.name = 'John'
) ilist join
interests i
on ilist.pid = i.pid and
ilist.uid <> i.uid -- forget about John
group by i.uid
但是,你实际上想要的是产品清单,而不仅仅是计数。所以,你必须加入到兴趣表中:
select i.*
from (select i.uid, COUNT(*) as cnt
from (select i.*
from interests i join
users u
on i.uid = i.id
where u.name = 'John'
) ilist join
interests i
on ilist.pid = i.pid and
ilist.uid <> i.uid -- forget about John
group by i.uid
) t join
interests i
on t.uid = i.uid
group by t.cnt, i.uid
答案 1 :(得分:0)
以下查询根据用户11的兴趣查找具有至少2个或更多相似兴趣的其他用户。
SELECT in2.UID FROM users u
INNER JOIN interest in1 ON (in1.UID = u.ID)
INNER JOIN interest in2 ON (in2.PID = in1.PID AND in2.UID <> u.ID)
WHERE u.ID = 11
GROUP BY in2.UID
HAVING COUNT(in2.UID) >= 2
ORDER BY COUNT(in2.UID) DESC
ORDER BY确保具有最相似兴趣的用户首先结束。 HAVING COUNT(in2.UID)&gt; = 2)确保找到的用户至少具有2个或更多相似的兴趣。