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

时间:2014-11-21 15:08:34

标签: mysql

我对四个表有查询。为了便于阅读,我将表名更改为t,将颜色更改为col

如果我不添加倒数第二行,则查询将按预期运行。好的。

但是当我想要排除col4的值为x的条目时,它不起作用。使用AND ...时,似乎只是忽略了AND ...。使用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;"

要排除我在数据库中可能包含太多x而我的LIMIT将跳过它们的错误,我只有一条x的记录。使用x时,仍会显示此值为AND ...的记录。

请有人向我解释,我的错误在于排除 col4 = "x" 的记录?


澄清:

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

来自t1的行获得t2t3的其他数据(始终通过一个ID连接,每t1行仅一行)。

如果t4.col4 = "x"那么整行不应该在结果中。

exampleT1 | exampleT2 | exampleT3 | asdf - &gt;是

exampleT1 | exampleT2 | exampleT3 | x - &gt;都能跟得上


第二次修改:

如果我没有把任何WHERE / AND / blablabla与x放在一起,那就是结果(见最右边的coloumn这个恶作剧x):

enter image description here

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

enter image description here

1 个答案:

答案 0 :(得分:1)

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

类似于:

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;

在这种情况下,我已经合并为一个硬编码的空字符串,但你可以使用“x”以外的任何值,它可以满足您的需要。