PHP+MySQL实现帖子三级可见权限的SQL查询求助
问题分析
你原有SQL存在核心逻辑错误:
- 同一字段用
AND连接两个互斥值(post.postStatus='public' and post.postStatus='follower'),永远无法返回匹配结果,同时你将权限规则里的private状态错写为follower,和表内实际字段值不匹配 - 没有对三类可见规则做
OR逻辑拆分,缺失同校用户判断、粉丝关系判断的独立逻辑分支
正确SQL写法
实现逻辑为:当前访问用户只要满足三类帖子的任意一条可见规则,即可查询到对应帖子。PHP场景下使用预处理语句绑定当前登录用户ID即可,注意不要直接拼接SQL避免注入风险:
SELECT p.*, u.userName AS postAuthorName FROM post p INNER JOIN user u ON p.userID = u.userID WHERE -- 帖子作者本人可查看自己所有帖子(常规业务补充逻辑,不需要可删除) p.userID = :currentUserID -- 规则1:公开帖子所有用户可见 OR p.postStatus = 'public' -- 规则2:私密帖子仅作者粉丝可见 OR ( p.postStatus = 'private' AND EXISTS ( SELECT 1 FROM follow f WHERE f.follow1 = :currentUserID AND f.follow2 = p.userID ) ) -- 规则3:校内帖子仅同校用户可见 OR ( p.postStatus = 'university' AND EXISTS ( SELECT 1 FROM user visitor WHERE visitor.userID = :currentUserID AND visitor.universityID = u.universityID ) )
效果验证
用你提供的测试数据验证结果完全符合需求:
- 访问用户ID为2时:仅能匹配到状态为
public的帖子 - 访问用户ID为3时:公开帖可见;因存在关注关系可查看
private帖子;因和作者同校可查看university帖子,所有帖子均可正常展示
内容的提问来源于stack exchange,提问作者user18589150
相关产品推荐
相关产品推荐

