2013-01-21 39 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从命令行运行查询,以查看您添加的索引如何被有效使用。 –