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
(将过滤结果)的和一个联接上的,这只会影响该联接。这就是关键的区别,也是为什么你的不起作用的原因。哦,那个的小儿子,
。。。再试一次,它现在可以正常工作了。谢谢你!:)