所以我有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'?如何最有效地做到这一点的任何帮助表示赞赏。
答案 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等时才公开。