Php SQL中的匹配兴趣(最近邻)搜索

Php SQL中的匹配兴趣(最近邻)搜索,php,mysql,sql,nearest-neighbor,Php,Mysql,Sql,Nearest Neighbor,我正试图通过以下模式找到兴趣相似的用户 USERS - ID name etc Interests - ID UID PID 其中ID是兴趣的唯一ID,UIS是用户ID,PID是产品ID。我已经看过了其他类似的问题,但没有一个有确切的答案 比如说,我想让用户对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

我正试图通过以下模式找到兴趣相似的用户

USERS - ID name etc

Interests - ID UID PID
其中ID是兴趣的唯一ID,UIS是用户ID,PID是产品ID。我已经看过了其他类似的问题,但没有一个有确切的答案

比如说,我想让用户对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个时间


有人能指引我正确的方向吗?可能的解决方案是什么?在上述给定的约束条件下,哪种解决方案是最好的。我在看能不能用这个

以下查询根据用户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 COUNTin2.UID>=2可确保找到的用户至少有2个或更多类似兴趣。

首先计算每个用户与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 

如果相似的兴趣可以定义为匹配产品ID的数量,那么您不需要ANN…这听起来是一个不错的解决方案,但它的效率如何?这取决于您的索引结构和数据大小。对于问题中的小数字,查询应该表现良好。在数据库中,即使是100*100操作也应该非常快。关于索引,来自兴趣的ID将是主键,我想在UID和PID上都使用索引。你有什么建议?