我想要实现的是一个复杂的隐私例程,我有下表。
帖子
帖子隐私
隐私全球
追随者名单
我们的网站上有一个新闻提要之类的东西,它从用户关注的人那里获取 10 个最新帖子,有 3 个隐私级别,第一个是 privacy_global,用户可以在他的帖子上设置隐私选项,0, 1 和 2 分别代表“只有我”、“所有人”、“仅限关注者”,然后有 posts_privacy 用户可以选择在发布之前列出他想要显示的人或隐藏帖子,此设置会覆盖privacy_global settings 和 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 PRIMARY KEY BIGINT(20)
userid BIGINT(20) << 点击关注用户的id
targetid BIGINT(20) << 被关注用户的id
邮政:
id PRIMARY KEY BIGINT(20)
content TEXT
title VARCHAR(100)
time DATETIME
userid BIGINT(20)
帖子隐私:
id PRIMARY KEY BIGINT(20)
postid BIGINT(20)
隐藏 BIGINT(20)
显示 BIGINT(20)