2013-01-21 69 views
0

所以我有3個表格:用戶,帖子,私人。在這個例子中,lizzy創建了一個私人帖子'約會',並且只希望她的女朋友在私人表中看到它'authorized_user_ids',並且在帖子表中她自己'user_id'。MySQL - Private Posts Display

users 
user_id user_name 
    1  tony 
    2  steph 
    3  lizzy 
    4  adam 
    5  lara 
    6  alexa 


posts 
post_id user_id post_name private (0 is public, 1 is private to authorized users) 
    1   1  Coding  0 
    2   3  Dating  1 
    3   3  Show Me  0 

private 
private_id post_id authorized_user_ids 
    1   2    2,5,6 

只有私人海報USER_ID和authorized_user_ids應該看到麗子的「約會」後,但每個人都應該能夠通過的Lizzy看到「演示」後。註銷的用戶和未經授權的用戶不應該看到任何內容。這是最有效的方式,或應該是:

private 
private_id post_id authorized_user_id 
    1   2    2 
    2   2    5 
    3   2    6 

這是我的第一個問題。我的第二個是什麼是從MySQL數據庫中提取數據時,在php(顯示到authorized_user_ids)中解決它的最好方法?我們是否根據posts表中的'private'標誌執行第二個查詢?如果它是1,我們在while循環中查詢以從私人表中獲得'authorized_user_ids',並且如果它匹配登錄用戶的$ logged_in_id,那麼我們顯示'約會'?還是應該在主查詢中使用'private_table'中的'post_id'和posts表中的'authorized _user_ids'進行連接?任何幫助如何最有效地做到這一點表示讚賞。

回答

1

首先問:我一定會用第二個版本。將authorized_user_id作爲CSV存儲會導致數據庫讀取和寫入操作變得效率低得多,因爲您最終將在應用程序代碼中始終分割CSV值並生成錯誤的動態SQL語句以處理更新。您不應該編寫PHP代碼來幫助查找像這樣的不同集合的數據交集,而是使用SQL。

二問:使用連接,而沒有例如循環

SELECT DISTINCT p.post_id, p.post_name FROM users as u 
JOIN posts as p on p.user_id=u.user_id 
LEFT JOIN private pv on pv.post_id=p.post_id 
WHERE (p.private=0) OR (authorized_user_id={$logged_in_id} and p.private=1) 

以上(或非常相似)將列出所有帖子$ logged_in_id是2,但只有公立當$ logged_in_id是4等

+0

就有效索引而言,private_id作爲主索引,post_id作爲索引,或post_id AND authorized_user_id作爲組合索引?感謝您的快速響應順便說一句。 – Maverick

+0

我認爲post_id和authorized_user_id上的複合索引可以工作,但如果不確定,請使用EXPLAIN從命令行運行查詢,以查看您添加的索引如何被有效使用。 –