我正试图找到具有类似兴趣集的用户,其模式如下。。
USERS - ID name etc
Interests - ID UID PID
其中ID是感兴趣的唯一ID,ui是用户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。我仍然认为上述方法根本不会有效,因为它将需要1002个时间。
有人能指引我正确的方向吗?什么是可能的解决方案,哪一个将是最好的与上述限制。我在看是否能用它。
最佳答案
首先计算每个用户与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