3

我正在尝试使用以下架构找到具有相似兴趣的用户..

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,看看我是否可以使用它。

4

2 回答 2

3

首先计算每个用户与 John 的共同兴趣数量。方法是获取 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 
于 2013-05-01T14:35:59.810 回答
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) >= 2) 确保找到的用户至少有 2 个或更多类似的兴趣。

于 2013-05-01T14:34:18.890 回答