我正在尝试开发一个功能,向我展示朋友的朋友,以及我与这些用户有多少共同的朋友。到目前为止,我已经能够单独完成这些功能但不能一起完成。
以下是我使用的主要视图,名为 userfriends 。其中user1是第一个用户,user2是朋友。
这是我为了看到两个用户之间的共同朋友而开发的功能
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。如果我不够清楚,请询问,我会尽量让它更清楚。这两个函数自己完成,但我不确定如何将它们合并在一起。
答案 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
;