1

次の構造を持つ 2 つのテーブルがあります。

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が の友人でありYYが の友人である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 に答える