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

MySQL 5.7中`is not true`在LEFT JOIN WHERE中异常的原因咨询

LEFT JOIN后WHERE条件过滤不符合预期的原因

问题场景

我有两张表:

  • flaw表:包含uid字段
  • userdata表:包含FlawId、IsDeleted(可为空)字段

想要获取所有未被用户标记为删除的flaw数据,执行了以下SQL:

select *
from flaw f
left join userdata `user` on f.uid = `user`.FlawId 
where `user`.IsDeleted is not true;

异常表现

示例数据

  • flaw表数据:
uid 
1
2
3
  • userdata表数据:
FlawId | IsDeleted
1      | null

实际返回结果仅包含uid=1的行,但预期应返回全部3条flaw数据。将WHERE子句中的条件移至ON子句后,结果符合预期。

原因说明

这是MySQL 5.7.36版本的官方已知Bug。

正常逻辑下,LEFT JOIN后,flaw表中没有匹配userdata的行,其user.IsDeleted字段会为NULL,NULL IS NOT TRUE的判断结果应为真,这类行不应被过滤。但该版本的MySQL在处理这种可空布尔字段的IS NOT TRUE判断时出现异常,错误地将这些无匹配的行排除在外。

而将条件移至ON子句时,是在表关联阶段就筛选userdata中符合条件的记录,无匹配的flaw行依然会被保留,因此结果符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:51:07