0

我正在创建一个小型社交网络,当用户在其中发布任何内容时。我会得到他推荐帖子的朋友的 id。现在的问题是,被推荐的用户可以介于1 or 10. 所以现在假设一个用户发布了一个状态并推荐了 6 个朋友。

现在我需要在发布状态的用户和被推荐的人之间找到共同的朋友。意思是假设发布状态的用户有id 1,被推荐的人有2,3,4,5,6,7

所以查询会做什么,它将在1 and 2那时找到共同的朋友1 and 31 and 4直到 7 点。所以最后我会得到一个结果,其中包含发布的用户和被推荐的人之间的共同朋友(或标记我们可以说)。

我有两张桌子UserFriends

 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

现在,friends 表可以包含用户表中存在或不存在的不同人。在此示例中,用户 2 和 3 有共同的 id 为 8 的朋友。我有我的人,但那个人 id 即8必须出现在用户表也是。这仅在用户 ID 2 和 3 之间。我将获得几个用户 ID,并且我找到了与发布状态的人推荐的所有朋友的共同朋友。

我希望我已经清除了它。如果我了解查询的想法,我可以使用 php 为不同数量的推荐朋友动态生成它。

到目前为止,我已经编写了这个查询。

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

但这只是给我带来了两个用户之间的共同朋友。当我添加第三个人时,让我们说f3并将其与f1它进行比较不会带来任何结果,并且此查询的另一个问题是它没有验证共同朋友 id 是否存在于用户表与否。添加第三个人后。

SELECT count(f1.friendsid) FROM friends AS f1
INNER JOIN friends AS f2 ON f1.friendsid = f2.friendsid
INNER JOIN friends AS f3 ON f1.friendsid = f3.friendsid
WHERE f1.userid = 100003052455644
AND f2.userid = 1097517748
AND f3.userid = 536772587

这个查询不会带来任何结果。所以我想创建一个查询来完成这一切。

编辑:

实际上我正在使用 facebook connect 并且当用户登录时我将所有用户的朋友保存在我的数据库中,用户表将只包含那些在我的网站上注册的用户。

4

1 回答 1

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。

具有id的用户100003052455644是发布状态的人,所有其他人都是他推荐的朋友。DISTINCT这将确保id的唯一性和不重复。这是他推荐的3个人。我们可以UNION ALL动态添加部分设置id,这将帮助我们创建一个动态查询来检索不同数量的推荐人的共同朋友。

于 2012-10-17T09:04:13.150 回答