MySQL - 私人帖子显示

时间:2013-01-21 23:24:15

标签: php mysql privacy

所以我有3个表:用户,帖子,私人。在这个例子中,lizzy创建了一个私人帖子'约会',只希望她的女朋友在私人表中看到'authorized_user_ids',并在帖子表中看到自己的'user_id'。

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看到“约会”帖子,但是每个人都应该能够通过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匹配,那么我们显示'约会'?或者,如果在私有表和posts表中使用'post_id',那么主查询中的某个地方是否应该使用'authorized _user_ids'?如何最有效地做到这一点的任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

第一个问:我肯定会选择第二个版本。将 authorized_user_id 存储为CSV将导致数据库读取和写入操作的效率降低,因为您最终会在应用程序代码中一直拆分CSV值并生成错误的动态SQL语句,以便流程更新。你永远不必编写PHP代码来帮助找到这样的不同数据集的交集,使用SQL。

第二个问题:使用连接,没有while循环,例如

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等时才公开。