2016-07-05 112 views
1

我敢肯定,這已被問及已答覆,但不知道問題應該如何。MySQL左連接NULL值

我有兩個表

ID | name 
========= 
1 | foo 
2 | bar 
3 | lou 
4 | sue 

和元表:

p_ID | key | value 
=================== 
    1 | poo | 1 
    2 | zoo | 'whatever' 
    3 | clu | 423 
    4 | poo | 1 

我希望得到第一個表不具有分配poo值的所有條目:

ID | name 
========= 
2 | bar 
3 | lou 

我的方法是

SELECT * 
    FROM table AS p 
    LEFT JOIN meta AS m 
    ON m.p_id = p.ID 
WHERE m.key = 'poo' 
    AND m.value IS NULL 

但這返回一個空的結果

回答

2

您必須將m.key = 'poo'表達式移動到ON子句中。 WHERE子句中的所有內容都必須存在,即使在LEFT JOIN中也是如此。

SELECT * 
    FROM table AS p 
    LEFT 
    JOIN meta AS m 
    ON m.p_id = p.ID 
    AND m.key = 'poo' 
WHERE m.value IS NULL 
+0

我知道這很容易! – Xaver

0

可以使用INNER JOIN代替。

SELECT * 
    FROM `table` T 
    INNER JOIN meta M ON M.p_id = T.ID 
    WHERE M.key <> 'poo' 
1

我想你應該想這一點;)

SELECT * 
FROM table AS p 
LEFT JOIN meta AS m 
ON m.p_id = p.ID 
AND m.key = 'poo' 
WHERE m.value IS NULL 

當您在WHERE子句中使用m.key = 'poo',這將被計算爲INNER JOIN,所以你只能得到記錄與m.key = 'poo',在表中沒有的所有行。