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

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

逻辑说明

  1. 第一层WHERE条件直接锁定所有:me参与的滑动记录,完全排除和:me无关的业务数据,从源头避免向其他用户返回数据的问题
  2. 关联用户表时用IF判断直接取对端用户ID,逻辑比CASE写在JOIN条件中更清晰,查询性能也更高
  3. 原有的权限校验规则和用户角色(发起方/接收方)绑定,保留原有业务逻辑不变

效果验证

当:me=1(即John)时,查询会先筛选出swipes表中ID为1、2的两行记录:

  • 第一行:me是发起方,关联对端用户ID=2即David,符合规则返回
  • 第二行:me是接收方,关联对端用户ID=3即Sweety,符合规则返回
    完全符合预期效果,其他用户登录时只会返回自己关联的对端用户数据。

内容的提问来源于stack exchange,提问作者Relaxing Music

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:06:02