あなたは、コンテンツの著作者が格納されているフィールドを提供しなかったので、私はそれがcontent.author
だと仮定します:
SELECT *
FROM content
WHERE public = 1
OR
(
public = 3
AND EXISTS
(
SELECT NULL
FROM friends
WHERE userId = @me
AND friendID = content.author
)
)
、またはより良い本:
SELECT *
FROM content
WHERE public = 1
UNION ALL
SELECT *
FROM content
WHERE public = 3
AND EXISTS
(
SELECT NULL
FROM friends
WHERE userId = @me
AND friendID = content.author
)
、あなたのauthor
フィールド場合選択的であり、分類はフィルタリングよりも安い。
また、あなたの友情は対称的関係であれば(userA
はuserB
に友人である場合、すなわち、そのuserB
がuserA
に友人である)ことに注意してください、それはこのようなテーブルに格納されている方が良いです:
userA userB
チェック制約付き:
Yuoは常に少なくともid
をユーザーに割り当てます。
この場合
、このようなクエリ:
SELECT *
FROM content
WHERE public = 1
UNION ALL
SELECT *
FROM content
WHERE public = 3
AND EXISTS
(
SELECT NULL
FROM friends
WHERE userA = @me
AND userB = content.author
UNION ALL
SELECT NULL
FROM friends
WHERE userB = @me
AND userA = content.author
)