我对四个表有查询。为了便于阅读,我将表名更改为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
的行获得t2
和t3
的其他数据(始终通过一个ID连接,每t1
行仅一行)。
如果t4.col4 = "x"
那么整行不应该在结果中。
exampleT1 | exampleT2 | exampleT3 | asdf
- &gt;是
exampleT1 | exampleT2 | exampleT3 | x
- &gt;都能跟得上
第二次修改:
如果我没有把任何WHERE / AND / blablabla与x放在一起,那就是结果(见最右边的coloumn这个恶作剧x):
当我对x使用排除时,我只是得到NULL - 但我希望整行消失:
答案 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”以外的任何值,它可以满足您的需要。