相互的朋友 - MySQL

时间:2012-12-24 09:52:02

标签: mysql database mutual-friendship

我正在尝试开发一个功能,向我展示朋友的朋友,以及我与这些用户有多少共同的朋友。到目前为止,我已经能够单独完成这些功能但不能一起完成。

以下是我使用的主要视图,名为 userfriends 。其中user1是第一个用户,user2是朋友。

enter image description here

这是我为了看到两个用户之间的共同朋友而开发的功能

SELECT id FROM users
WHERE id IN (
    SELECT user2 FROM userfriends WHERE user1 = me
) AND id IN (
    SELECT user2 FROM userfriends WHERE user1 = second
)

用户是一个主表,可以将在userfriends表中找到的用户ID链接到有关用户的信息。我和第二个是存储过程中的变量,它模拟搜索第一个和第二个用户。此功能可用于计划。

我的第二个功能是看到所有与我的朋友成为朋友的用户,但不是我的用户。

SELECT user2 AS id
FROM userfriends
    WHERE user1 IN (
        #Selects my friends
        SELECT user2 FROM userfriends
        WHERE user1 = me
    ) 
    AND user2 <> me #Makes sure is not me
    AND user2 NOT IN ( #Makes sure not already friend
        SELECT user2 FROM userfriends
        WHERE user1 = me
    )

同样,所有正在计划和我的人都代表用户ID。这将返回我所有朋友朋友的列表。

我希望能够获得的不是共同用户列表,还是我的朋友朋友列表:

一张表,其中包含我朋友的朋友用户ID以及我与该用户共享的共有多少朋友。等等:用户:1,friends_in_common:103。如果我不够清楚,请询问,我会尽量让它更清楚。这两个函数自己完成,但我不确定如何将它们合并在一起。

1 个答案:

答案 0 :(得分:1)

-- use a self-join of userfriend*userfriend
-- to find all the friends that moi&toi have in common
-- , and count them.
-- (optionally) suppress the rows for (toi<=moi)
-- , because there are basically the same as the corresponding rows with
-- (toi>moi)
-- -----------------------------------
SELECT DISTINCT 
   uf1.user1 AS moi
   , uf2.user1 AS toi
   , COUNT(*) AS cnt
   FROM userfriend uf1
   JOIN userfriend uf2 ON uf1.user2 = uf2.user2
   WHERE uf1.user1 < uf2.user1 -- Tie breaker, symmetry remover
   GROUP BY uf1.user1, uf2.user1
   ;