简单的方法是做一些简单的嵌套子句。所以假设你有一个包含帖子和海报 id 的表,还有一个朋友表,第一层是
SELECT post FROM posts JOIN friends
on post.userid = friends.friend_id
WHERE friend.id = 1 (user ID)
然后去交朋友的朋友
SELECT post FROM posts JOIN
(SELECT DISTINCT friends_2.friend_id FROM friends AS friends_1
JOIN friends as friends_2
on friends_1.friend_id = friends_2.id where friends_1.id = 1)
AS friends
wHERE post.userid = friends.friend_id AND mainid = 1 (user ID)
您可以在每次想要添加另一层朋友抽象时重复此嵌套。这种方法的问题是执行需要很长时间。每次添加朋友抽象层时,复杂性都会增加 n 次方(其中 n 是表中的行数)。
他们更有可能将可查看的朋友保存在某个表格中,所以让我们创建一个名为 friends_web 的新表格
user_id, friend_id, level
当用户与某人成为朋友时,它会将新朋友添加到 Friends_web 中,级别为 0(因为该朋友没有人离开),然后将该朋友的朋友添加到级别 1(因为它的 1 个朋友离开)。为了保持表的完整性,您还需要添加倒排记录。为了澄清 A 是否将 B 添加为好友,而 C 是 B 的好友,以下两条记录将被添加到我们的新表中
A, C, 1
C, A, 1
因为现在A可以看到C,C也可以看到A。
现在当我们想要查询时,我们就去做
SELECT post FROM posts
JOIN friends_web ON post.user_id = friends_web.friend_id
WHERE friends_web.user_id = user_id AND friends_web.level < 2 (or however deep you want to look)
通过这样做,您在进行帖子查找时最大程度地降低了查询的复杂性,同时能够深入查看超过 1 层的朋友网络。
抱歉,回答冗长。