Facebook或LinkedIn喜欢连接建议配置文件提醒

时间:2014-08-14 14:48:15

标签: php mysql linkedin

我有一个“用户”表格,如下所示:

+-----+------------+---------+---------------+
| uid | first_name | surname |         email |
+-----+------------+---------+---------------+
      1        joe    bloggs    joe@test.com
      2       bill    bloggs   bill@test.com
      3       john    bloggs   john@test.com
      4       karl    bloggs   karl@test.com

和“连接”表格如下:

+----+---------+----------+--------+
| id | user_id | user_id2 | status |
+----+---------+----------+--------+
   1         1          3        1
   2         3          1        1
   3         4          3        1
   4         3          4        1
   5         2          3        1
   6         3          2        1

此处id为auto auto_increment用户ID保存在user_id或user_id2中。状态1表示连接已批准并处于活动状态。

现在,我想向有Facebook或LinkedIn等个人资料建议的用户发送电子邮件提醒。我假设可以在用户之间建立相互联系,但不知道该怎么做。我试过但它并不完美。我希望通过一个用户及其建议的连接配置文件的mysql查询来获取这些内容。知道怎么做吗?

非常感谢提前!

1 个答案:

答案 0 :(得分:3)

这样的算法永远不会完美:你永远无法确切知道两个人是否相互认识。人们可能住在同一栋楼里,去做同样的工作,共有100个朋友,甚至在不知道对方的情况下分享相同的爱好(当然可能性不大)。

社交网络究竟做什么当然是未知的(这是他们赚钱方式的一部分)。但是有些方面是已知的。例如,共同朋友的数量很重要(例如,地点,兴趣,爱好,教育,工作,姓氏......)。

根据您提供的内容,可以或多或少地仅使用共同朋友的数量。这可以使用以下查询来完成:

SELECT a.user_id, b.user_id2, count(*) --Select the two ids and count the number of transitive relations
FROM connections as a, connections as b --Use the table twice (transitivity)
WHERE a.user_id2 = b.user_id  -- Transitivity constraint
      AND a.user_id < b.user_id2 -- Maintain strict ordening (can be dropped when checked)
      AND a.status = 1 -- First relation must be confirmed.
      AND b.status = 1 -- Second connection must be confirmed.
      AND NOT EXISTS ( -- Not yet friends
          SELECT *
          FROM connections as c
          WHERE c.user_id = a.user_id
                AND c.user_id2 = b.user_id2
      )
GROUP BY a.user_id, b.user_id2 -- Make sure we count them correctly.

正如您可以看到here,小提琴计算出(1,2)(1,4)(2,4)还不是朋友,并且所有人都有一个共同的朋友。

一旦共同朋友的数量超过某个阈值,就可以提出友谊。

但我建议你让表格更紧凑:在表格中加CHECKuser_id总是严格小于user_id2CHECK(user_id < user_id2))。这使得数据库更紧凑,对于数据库工具的大多数实现来说也更快,并且查询将变得更简单。 (1,3,1)(3,1,1)之间的区别是什么。