MySQL CASE函数查询结果不符合预期,如何限制仅返回登录用户数据
MySQL CASE查询多返回非目标用户数据的解决方案
问题根因
原查询未提前筛选仅和当前登录用户:me相关的滑动记录,会全表扫描swipes表的所有数据,自然会将其他用户关联的匹配结果同时返回,才会出现向David、Sweety也返回John数据的问题。
优化后查询语句
SELECT u.name, u.gender, s.swp_to, s.first_swp FROM swipes s -- 第一步:过滤所有和当前登录用户无关的滑动记录,从源头排除非目标数据 WHERE s.swp_from = :me OR s.swp_to = :me -- 关联对端用户:是发起方就关联接收方,是接收方就关联发起方 LEFT JOIN users u ON u.id = IF(s.swp_from = :me, s.swp_to, s.swp_from) -- 保留原业务的权限校验规则,过滤不符合展示条件的记录 WHERE ( s.swp_from = :me AND ( s.first_swp NOT IN ('like', 'superlike') OR (s.first_swp IN ('like', 'superlike') AND s.second_swp NOT IN ('like', 'superlike')) ) ) OR ( s.swp_to = :me AND ( (s.first_swp NOT IN ('like', 'superlike') AND s.second_swp != 'pending') OR (s.first_swp IN ('like', 'superlike') AND s.second_swp NOT IN ('like', 'superlike', 'pending')) ) ) -- 可选:按滑动记录ID去重,避免重复返回数据 GROUP BY s.id
逻辑说明
- 第一层WHERE条件直接锁定所有
:me参与的滑动记录,完全排除和:me无关的业务数据,从源头避免向其他用户返回数据的问题 - 关联用户表时用
IF判断直接取对端用户ID,逻辑比CASE写在JOIN条件中更清晰,查询性能也更高 - 原有的权限校验规则和用户角色(发起方/接收方)绑定,保留原有业务逻辑不变
效果验证
当:me=1(即John)时,查询会先筛选出swipes表中ID为1、2的两行记录:
- 第一行
:me是发起方,关联对端用户ID=2即David,符合规则返回 - 第二行
:me是接收方,关联对端用户ID=3即Sweety,符合规则返回
完全符合预期效果,其他用户登录时只会返回自己关联的对端用户数据。
内容的提问来源于stack exchange,提问作者Relaxing Music
相关产品推荐
相关产品推荐

