我有一个“用户”表格,如下所示:
+-----+------------+---------+---------------+
| 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查询来获取这些内容。知道怎么做吗?
非常感谢提前!
答案 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)
还不是朋友,并且所有人都有一个共同的朋友。
一旦共同朋友的数量超过某个阈值,就可以提出友谊。
但我建议你让表格更紧凑:在表格中加CHECK
,user_id
总是严格小于user_id2
(CHECK(user_id < user_id2)
)。这使得数据库更紧凑,对于数据库工具的大多数实现来说也更快,并且查询将变得更简单。 (1,3,1)
和(3,1,1)
之间的区别是什么。