MYSQL中LEFT JOIN无法过滤Void状态的问题求助
解决MySQL LEFT JOIN排除关联表特定状态的问题
你的原语句问题出在WHERE T2."Status" <> 'Void'这个条件上——当T1没有匹配的T2记录时,T2的所有字段(包括Status)都是NULL,而NULL和任何值做比较结果都不成立,所以这些T1的记录会被过滤掉,不符合你"保留Table 1所有数据"的需求。
给你两种可行的写法:
方法一:将过滤条件移到JOIN的ON子句中
SELECT * FROM `Table 1` T1 LEFT JOIN `Table 2` T2 ON T1.ID = T2.ID AND T2.`Status` <> 'Void';
这样LEFT JOIN只会关联T2中Status不等于'Void'的记录,T1的所有行都会被保留,没有符合条件的T2关联时,T2字段显示为NULL。
方法二:在WHERE子句中兼容NULL情况
SELECT * FROM `Table 1` T1 LEFT JOIN `Table 2` T2 ON T1.ID = T2.ID WHERE T2.`Status` <> 'Void' OR T2.`Status` IS NULL;
这里明确允许两种情况:要么T2的Status不是'Void',要么T2没有匹配记录(Status为NULL),这样就能保留所有T1数据,同时排除T2中Status为'Void'的关联行。
注:MySQL中带空格的表名/字段名建议用反引号``包裹,比双引号兼容性更好,除非你开启了ANSI_QUOTES模式。
内容的提问来源于stack exchange,提问作者DannyP
相关产品推荐
相关产品推荐

