我正在创建一个小型社交网络,当用户发布任何内容时。我会收到他推荐帖子的朋友的ids。现在的问题是,被推荐的用户可能介于{{1}之间}。所以现在假设用户发布了一个状态并推荐了6个朋友。
现在我需要在发布状态的用户和逐个推荐的人之间找到共同的朋友。意味着假设发布状态的用户具有标识1 or 10
并且被推荐的人具有{{1 }}
那么查询将会发现它会在1
然后2,3,4,5,6,7
然后1 and 2
之间找到共同的朋友,依此类推。直到7.结束时,我将得到包含该结果的结果发布的用户与被推荐的人(或我们可以说是标记的)之间的共同朋友。
我有两张表1 and 3
和1 and 4
User
现在,朋友表可以包含在用户表中存在或不存在的不同人。在此示例中,用户2和3具有共同ID为8的朋友。我有我的家伙,但是那个家伙是{{{ 1}}也必须存在于用户表中。这仅在用户标识2和3之间。 我将获得几个用户ID,并且我找到所有朋友的共同朋友,这些朋友被提交给已经发布状态的人。
我希望我已经清除了它。如果我得到了查询的想法,我可以使用php为不同数量的推荐朋友动态生成它。
到目前为止,我已经写了这个查询。
Friends
但这只会给我两个用户之间的共同朋友。当我添加第三个人时,可以说 User Table: Friends Table:
-------------------------- -----------------------------------
UserID Name friendsid friendname userid
-------------------------- -----------------------------------
1097517748 User1 3 friend1 536772587
100003052455644 User2 8 friend2 100003052455644
536772587 User3 8 friend3 1097517748
4 User4 3 friend4 100003052455644
并将其与8
进行比较,但它不会带来任何结果,此查询的另一个问题是它没有验证共同的朋友ID是否存在于用户表中。添加第3个人之后。
SELECT count(f1.friendsid) FROM friends AS f1
INNER JOIN friends AS f2 ON f1.friendsid = f2.friendsid
WHERE f1.userid = 100003052455644
AND f2.userid = 1097517748
此查询不会带来任何结果。所以我想创建一个完成所有这些操作的查询。
修改
实际上我正在使用facebook连接,当用户登录时,我将所有用户朋友保存在我的数据库中,用户表将只包含在我的网站上注册的用户。
答案 0 :(得分:1)
我终于明白了。查询是
SELECT DISTINCT(friendsid) FROM (
SELECT DISTINCT(f1.friendsid) FROM friends AS f1
INNER JOIN friends AS f2 ON f1.friendsid=f2.friendsid
and f1.userid = 100003052455644 and f2.userid =1097517748
INNER JOIN user ON f2.friendsid = user.userid and f1.friendsid = user.userid
UNION ALL
SELECT (f1.friendsid) FROM friends AS f1
INNER JOIN friends AS f2 ON f1.friendsid=f2.friendsid
and f1.userid = 100003052455644 and f2.userid =536772587
INNER JOIN user ON f1.friendsid = user.userid and f2.friendsid = user.userid
UNION ALL
SELECT DISTINCT(f1.friendsid) FROM friends AS f1
INNER JOIN friends AS f2 ON f1.friendsid=f2.friendsid
and f1.userid = 100003052455644 and f2.userid =694250830
INNER JOIN user ON f1.friendsid = user.userid and f2.friendsid = user.userid
) a
此查询将查找发布状态的用户与其提及的用户之间所有共同朋友的ID。
身份100003052455644
的用户是发布状态的人,而其他所有人都是他推荐的朋友。DISTINCT
将确保身份证明是唯一且不会重复。这是针对他引用了3个人。我们可以添加动态设置id的UNION ALL
部分,这将有助于我们创建动态查询,以便为不同数量的推荐人检索共同的朋友。