You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 18:36:24