MySQL查询未返回预期结果:筛选满足特定条件的Token
问题排查与解决
原查询的问题
原查询逻辑存在矛盾:一条TableB记录只能有一个Key值,不可能同时满足b.key = 'Method'和b.key in ('App', 'Manual', 'Stored')这两个互斥条件,因此这个查询永远返回空结果。
正确解法
解法1:分组聚合判断(扩展性好)
通过分组统计符合条件的记录数,确保Token同时满足所有要求:
SELECT a.Token FROM TableA a JOIN TableB b ON b.TableA_Token = a.Token GROUP BY a.Token HAVING -- 验证存在Method=Virtual的记录 SUM(CASE WHEN b.`Key` = 'Method' AND b.Value = 'Virtual' THEN 1 ELSE 0 END) > 0 -- 验证App、Manual、Stored的Value全为N(即没有非N的记录) AND SUM(CASE WHEN b.`Key` IN ('App', 'Manual', 'Stored') AND b.Value != 'N' THEN 1 ELSE 0 END) = 0;
解法2:多EXISTS子查询(逻辑直观)
通过多个存在性判断,逐一验证每个Key的条件:
SELECT a.Token FROM TableA a WHERE EXISTS ( SELECT 1 FROM TableB b WHERE b.TableA_Token = a.Token AND b.`Key` = 'Method' AND b.Value = 'Virtual' ) AND EXISTS ( SELECT 1 FROM TableB b WHERE b.TableA_Token = a.Token AND b.`Key` = 'App' AND b.Value = 'N' ) AND EXISTS ( SELECT 1 FROM TableB b WHERE b.TableA_Token = a.Token AND b.`Key` = 'Manual' AND b.Value = 'N' ) AND EXISTS ( SELECT 1 FROM TableB b WHERE b.TableA_Token = a.Token AND b.`Key` = 'Stored' AND b.Value = 'N' );
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

