【发布时间】:2011-03-20 22:43:45
【问题描述】:
我想要实现的是一个复杂的隐私例程,我有以下表格。
帖子
posts_privacy
privacy_global
关注列表
我们的网站上有一个新闻提要之类的东西,它从用户关注的人那里获取 10 条最新帖子,有 3 个隐私级别,首先是 privacy_global,用户可以在他的帖子上设置隐私选项, 0 , 1 和 2 分别代表“Only me”, “Everyone”, “followers only”,然后有 posts_privacy 用户可以选择在发布之前列出他想要显示的人或隐藏帖子,这个设置如果设置了,则覆盖privacy_global 设置和posts_privacy。
现在我的问题是,当我使用 php 在新闻提要中应用隐私时,我基本上要求这样的帖子。
SELECT `post`.*,
`users`.`fullname`,
`users`.`username`,
`posts_privacy`.`hide`,
`posts_privacy`.`show`,
FROM `post`
LEFT JOIN `posts_privacy` ON `post`.`id`=`posts_privacy`.`postid`
INNER JOIN `users` ON `post`.`userid` = `users`.`id`
WHERE (`post`.`userid` IN (1,2,3,4,5,6)
AND 12 NOT IN (
SELECT `hide` FROM `posts_privacy` WHERE `postid`=`post`.`id`)
OR `show`= 12
)
GROUP BY `post`.`id`
ORDER BY `time` DESC LIMIT 10"
我不知道如何应用所有其他条件,在此之前我使用另一个查询并返回需要隐藏或显示帖子的人的序列化数组,然后在 php 中取消序列化并对其进行处理并删除该帖子在发送到浏览器之前从数组中创建一个漏洞,而不是加载 10 个帖子,只出现 6 个帖子,因为 php 在进入浏览器之前删除了 4 个具有隐私的帖子,我的目标是在帖子离开数据库之前 SQL 中的所有隐私条件,所以我对新闻源中帖子的计数没有这个问题。
我尝试查看 MySQL 函数和过程,但被告知它们无法处理查询或返回表。
关于如何解决这个问题的任何建议?
编辑:如果有帮助,我尝试制作的系统与 Facebook 上的系统类似,用户可以在其中设置帖子特定的隐私,但也有全局设置,完成后会被覆盖。
表结构:
关注者列表:
id 主键 BIGINT(20)
userid BIGINT(20)
targetid BIGINT(20)
发帖:
id 主键 BIGINT(20)
内容文本
标题 VARCHAR(100)
时间日期时间
用户 ID BIGINT(20)
posts_privacy:
id 主键 BIGINT(20)
postid BIGINT(20)
隐藏 BIGINT(20)
显示 BIGINT(20)
【问题讨论】:
-
你能展示相关表格的结构吗?只需要重要的字段就可以了。
followerlist和其他表之间有什么关系 - 它只是与每个用户关联的用户 ID 列表吗? -
是的,差不多就是这样,它有关注者 id 和被关注的人。
-
posts_privacy表中的hide和show列是否包含users.id值? -
是的,他们这样做了,如果需要向某人隐藏帖子,他的 id 最终会在 hide 列中,否则它是 show 列,只有 if hide has and id in it then show is null反之亦然,posts_privacy 用于 perpost 隐私,需要优先于全局隐私设置