如何仅在登录用户为页面创建者时优先展示block=1的页面成员?
解决方案:带权限控制的页面成员查询
没问题,我来帮你搞定这个页面成员的权限查询和排序需求。咱们先明确核心逻辑,再写出对应的SQL:
核心需求回顾
- 当登录用户是页面创建者时:展示所有成员,且优先显示需要授权(
block=1)的成员 - 当登录用户不是页面创建者时:仅展示已授权(
block=0)的成员
最终SQL实现
我们需要传入当前登录用户的ID(这里用@current_user_id作为参数,你可以替换成实际业务中获取登录用户ID的方式),SQL如下:
SELECT p.user AS page_owner, p.title, pm.user AS member_user_id, pm.block FROM page_members pm INNER JOIN page p ON pm.member = p.id WHERE pm.member = 100 -- 替换为目标页面ID AND ( -- 情况1:当前用户是页面创建者,允许所有成员 p.user = @current_user_id -- 情况2:非创建者,仅允许已授权成员 OR pm.block = 0 ) -- 排序逻辑:仅创建者登录时,优先展示需授权的成员 ORDER BY CASE WHEN p.user = @current_user_id THEN pm.block DESC ELSE pm.block END;
代码细节解释
- 关联表选择:用
INNER JOIN而非LEFT JOIN,因为我们必须获取页面的创建者信息来做权限判断,无效的页面记录没有意义。 - WHERE条件过滤:通过
OR分支实现两种权限场景的过滤:- 如果当前用户是页面创建者,直接放行所有成员记录
- 如果不是创建者,只保留
block=0的已授权成员
- 排序控制:用
CASE语句实现动态排序:- 仅当当前用户是创建者时,按
block降序排列(让block=1的需授权成员排在最前面) - 非创建者登录时,因为结果都是
block=0,排序不会产生实际影响,但保持语法完整性
- 仅当当前用户是创建者时,按
可选优化
如果需要让相同状态的成员有更稳定的排序(比如按加入时间、成员ID),可以在ORDER BY里补充字段:
ORDER BY CASE WHEN p.user = @current_user_id THEN pm.block DESC ELSE pm.block END, pm.id ASC; -- 按成员记录ID升序排列
内容的提问来源于stack exchange,提问作者RGS
相关产品推荐
相关产品推荐

