2009-07-23 43 views
1

說我有保存內容的表:設置的內容是通過好友顯示只有

內容(內容識別,標題,正文,privacyType)

隱私類型可以是:

公共= 1 (任何人都可以查看它) 私人= 2(只有作者可以查看) 朋友= 3(只有朋友可以查看它)

我有一個用戶表:

用戶(用戶ID,用戶名)

然後我對用戶的朋友的映射表:

朋友(用戶ID,friendID)

現在,當我列出的所有內容,應列出內容是公開的或我是該用戶的朋友(對於登錄用戶)

我將如何爲此查詢?

回答

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場是有選擇性的,分類比過濾便宜。

還要注意的是,如果你的友誼是一個對稱的關係(即,如果一個userA是朋友userB,然後userB是朋友userA),它是在一個表像這樣更好的存儲:

userA userB 

與檢查約束:

userA < user B 

宥始終把用戶與至少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 
     )