2009-07-23 7 views
1

私は、コンテンツを保持するテーブルを持っていると言う:は友人によって閲覧されるコンテンツの設定のみ

コンテンツ(コンテンツID、タイトル、本文、privacyType)

プライバシータイプを指定できます

公開= 1

:私は、ユーザーテーブルを持っている プライベート= 2(唯一の著者はそれを見ることができる) 友達= 3(唯一の友人はそれを見ることができる)

を(誰もがそれを見ることができます)それはリストする必要があり、私はすべてのコンテンツを一覧表示していたときに今

フレンズ(ユーザID、friendID)

ユーザ(ユーザID、ユーザ名)

それから私は、ユーザーの友人のためのマッピングテーブルを持っています公開されているか、またはそのユーザーの友人です(ログインしているユーザー用)

どのように私はこの質問をしますか?

答えて

4

あなたは、コンテンツの著作者が格納されているフィールドを提供しなかったので、私はそれが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フィールド場合選択的であり、分類はフィルタリングよりも安い。

また、あなたの友情は対称的関係であれば(userAuserBに友人である場合、すなわち、そのuserBuserAに友人である)ことに注意してください、それはこのようなテーブルに格納されている方が良いです:

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 
     ) 
関連する問題