Mysql 为什么我的AND或WHERE子句不起作用?

Mysql 为什么我的AND或WHERE子句不起作用?,mysql,Mysql,我确实有一个关于四个表的查询。为了便于阅读,我将表名改为t,将列改为col 如果不添加最后第二行,查询将按其应该的方式运行。很好 但是当我想排除col4值为x的条目时,它就不起作用了。当使用和…时,它似乎忽略了和…。使用WHERE…时,我得到一个空结果 SELECT t1.col1, t2.col2, t3.col3, t4.col4 FROM t2ble1 t1 LEFT JOIN t2ble

我确实有一个关于四个表的查询。为了便于阅读,我将表名改为
t
,将列改为
col

如果不添加最后第二行,查询将按其应该的方式运行。很好

但是当我想排除
col4
值为
x
的条目时,它就不起作用了。当使用
和…
时,它似乎忽略了
和…
。使用
WHERE…
时,我得到一个空结果

SELECT      t1.col1,
            t2.col2,
            t3.col3, 
            t4.col4
FROM        t2ble1 t1
LEFT JOIN   t2ble2 t2 
ON          t1.col1 = t2.col1 
LEFT JOIN   table3 t3
ON          t3.col1 = t1.col1 
LEFT JOIN   table4 t4
ON          t4.col1 = t1.col1
AND t4.col4 <> "x"
LIMIT 10;"
选择t1.col1,
t2.col2,
t3.col3,
t4.4
从t2ble1到t1
左连接t2ble2t2
关于t1.col1=t2.col1
左连接表3 t3
在t3.col1=t1.col1上
左连接表4 t4
在t4.col1=t1.col1时
和t4.col4“x”
限制10;"
为了排除数据库中可能有太多
x
的错误,并且我的
LIMIT
将跳过它们,我只有一条
x
记录。使用
和…
时,仍然会显示这个值为
x
的记录

请有人向我解释一下,我的错误是排除带有
col4=“x”


请澄清:

我想从
t1
中选择。此数据应在结果中显示1x

t1
中的行从
t2
t3
中获取附加数据(始终通过一个ID连接,每个
t1
行仅一行)

如果
t4.col4=“x”
则整行不应出现在结果中

exampleT1 | exampleT2 | exampleT3 | asdf
->是

exampleT1 | exampleT2 | exampleT3 | x
->否


第二次编辑:

如果我没有把任何WHERE/AND/blabla和x放在一起,这就是结果(见最右边的冒失的x):

当我对x使用excludes时,我只得到NULL-,但我希望整行消失


NULL
进行比较的结果也是
NULL
,因此作为
WHERE
条件,您隐式地丢弃了
t4
中没有记录的行,相反,您可以
合并
以始终使用非NULL值进行比较,并且您将始终得到真实的结果

比如:

SELECT      t1.col1,
            t2.col2,
            t3.col3, 
            t4.col4
FROM        t2ble1 t1
LEFT JOIN   t2ble2 t2 
ON          t1.col1 = t2.col1 
LEFT JOIN   table3 t3
ON          t3.col1 = t1.col1 
LEFT JOIN   table4 t4
ON          t4.col1 = t1.col1
WHERE       COALESCE(t4.col4, '') <> 'x'
LIMIT 10;
选择t1.col1,
t2.col2,
t3.col3,
t4.4
从t2ble1到t1
左连接t2ble2t2
关于t1.col1=t2.col1
左连接表3 t3
在t3.col1=t1.col1上
左连接表4 t4
在t4.col1=t1.col1时
其中聚结(t4.col4,)‘x’
限制10;

在本例中,我合并到了一个硬编码的空字符串,但您可以使用除“x”之外的任何值,它可以满足您的需要。

如当前所述,当col4为“x”时,与t4的连接将失败“,但所有其他联接仍可能成功。如果您将其更改为
WHERE
子句,那么您就隐式地将该左连接更改为一个内部连接,同样,该值不是“x”。不清楚是否希望col4中的NULL出现在结果集中?是否确定t4.col4中没有特殊字符或空格?如果您将其设置为=“x”,会发生什么情况?您是否恢复了任何记录?或者“X”是否启用了区分大小写功能?我的猜测是,它工作正常,列中的数据不是您所期望的。将其切换为
=
不会改变任何结果-我还查找了区分大小写的信息。所以我想罗兰走的路是对的。。。澄清一下:在
t4
中不必有任何适合的记录-这就是为什么我得到了
左连接。但是如果在
t4
中有一条记录,我希望整行不会显示在结果中。我对您得到的结果感到困惑,您会看到t4.col4列在限制为10条记录时包含“X”。当您有
和t4.col4“x”
时。考虑到上述连接,这是不可能的,除非mySQL中存在bug(我在本例中对此表示怀疑)。所以不能是“x”,现在我也很困惑D我的意图是联接所有4个表,但只在
col4“x”
中显示结果。(我想这条捷径听起来更简单。:)谢谢你的贡献!不幸的是,这并没有改变我想要的结果。。。我在我的末日问题中添加了第二个编辑,以确保我的行为:如果最后一行(
链接
)中有一个邪恶的
x
,我希望整行日期(在本例中
NETFOR350_HHN
作为ID)消失。您的屏幕截图显示了该行为,使用此代码,或者如果它是
WHERE
子句,就像我的例子?两者都有。你可以看到它就像你的代码一样,但我确实改变了其他名字的“t”和“col”,因为它们是为了清晰起见而使用的。或者我误解了什么?您还更改了一个
WHERE
(将过滤结果)的
和一个联接上的
,这只会影响该联接。这就是关键的区别,也是为什么你的不起作用的原因。哦,那个
的小儿子,
。。。再试一次,它现在可以正常工作了。谢谢你!:)