1

我有两个具有以下结构的表:

table name: friends
uid (PK)(FK)
friend_id (PK)(FK)

table name: posts
post_id (AI)(PK)
post_text
uid (FK) //poster id

我想选择仅由 user 的朋友发布的帖子x。我最初的计划是使用以下代码:


SELECT posts.post_text INNER JOIN friends ON posts.uid = friends.friend_id 
WHERE friends.uid = x

但是,这似乎不起作用。(我得到了 x 完成的所有帖子,完成了 X 的朋友完成的所有帖子。我能想到的唯一选择是使用 OR 的(可能很长的)字符串 - 如

WHERE posts.uid = 'friend_id_1' OR posts.uid = 'friend_id_2' ect..

任何替代解决方案?谢谢。

4

2 回答 2

1
SELECT  posts.*
FROM    friends
JOIN    posts
ON      posts.uid = friends.friend_id
WHERE   friends.uid = 'x'

此查询应该有效,因此您最好检查您的数据。

你不是偶尔结交X他自己的朋友吗?

如果你的友谊关系是对称的,即如果X是 的朋友Y,那么Y是 的朋友X,那么你应该这样制作表格:

friends (a, b, PRIMARY KEY (a, b), KEY (b))

SELECT  posts.*
FROM    (
        SELECT  b AS friend_id
        FROM    friends
        WHERE   a = 'X'
        UNION ALL
        SELECT  a AS friend_id
        FROM    friends
        WHERE   b = 'X'
        ) friends
JOIN    posts
ON      posts.uid = friends.friend_id

在插入一对朋友之前,请始终将其安排为A < B,即最少的用户user_id进入A

于 2009-08-13T16:42:55.507 回答
0

我想这就是你要找的

SELECT posts.post_text INNER JOIN friends ON posts.uid = friends.friend_id 
Inner join friends fr on friends.friend_id = fr.uid
WHERE friends.uid = x
于 2009-08-13T16:43:41.013 回答