句は、ブール式である(単純または複雑な)条件を両方とも受け入れるという点で句に似ON
ています。演算子はブール演算子であるため、と同様に使用できます。結合条件で任意の方法を使用して、要件を満たす演算子を作成してください。WHERE
OR
ON
WHERE
OR
私はあなたがあなたの質問で基本的に正しい軌道に乗っていると思います。おそらく、現時点で他のことに集中しているという理由だけで、あなたが見逃している可能性のあるいくつかのことを指摘したいと思います。
1つは、結合のタイプです。テーブルには、ユーザーと他friends
のユーザーの間のリンクだけでなく、さまざまなユーザー間の既存のリンクがすべて含まれているはず5
です。したがって、左結合(外部結合)で結合すると、ユーザーだけでなく、からすべてのリンクを取得しますがfriends
、これはおそらく必要なものではありません。もちろん、のような条件で句を追加することもできますが、それは基本的に、その条件のない内部結合と同等です。したがって、代わりに内部結合を使用してください。posts
friends
5
WHERE
friends.id IS NOT NULL
ただし、もちろん、ユーザー5の友達だけを参加させたいので、あなたのWHERE
条項が必要になる可能性があるのは条件です。つまり、友達であることが確認された友達を意味すると思います。friends.acepted = 1
acepted
1
もちろん、5
どこかにユーザーの条件もなければなりません。私には、ユーザーの友達だけfriends
を表し、それらも単一の列として表すテーブルを派生させるのが最も簡単だと思います。(つまり、両方のフィルターが、結合の結果セットではなく、派生テーブルに適用されます。)このようにすると、結合条件が単純になるため、友人をテーブルに結合するのが簡単になります。このようなテーブルを導出する方法の1つを次に示します。5
posts
SELECT
id,
CASE followerid WHEN 5 THEN followingid ELSE followerid END AS friend_id
FROM friends
WHERE acepted = 1
AND (followerid = 5 OR followingid = 5)
つまり、このクエリは、ユーザー( )の友達( acepted = 1
)であるユーザーIDを取得します。単一のユーザーID列、は、またはのいずれかで構成されます。一方がの場合、もう一方はプルされます。その逆も同様です。5
followerid = 5 OR followingid = 5
friend_id
followerid
followingid
5
そして、これが最終的なクエリでこの派生テーブルを使用する方法です。
SELECT
p.*,
f.id /* there's an `id` column in `posts`, so it might be a good idea
to assign `friends.id` a distinct alias, like `friends_id` */
FROM (
SELECT
id,
CASE followerid WHEN 5 THEN followingid ELSE followerid END AS friend_id
FROM friends
WHERE acepted = 1
AND (followerid = 5 OR followingid = 5)
) AS f
INNER JOIN posts AS p ON p.id_user = f.friend_id