2017-05-03 33 views
0

我有兩個表具有這樣的結構。首先,用戶表:如何使用Where左前加入MySQL

id | email | password 
1 'email' 'pass' 
2 'new2'  'pass' 

和報告表:

user_id | field | text 
    1   4  Tom 

我怎樣才能返回回來,即使用戶沒有在report表匹配的emailpassword值?這是我迄今爲止所擁有的。

select a.email, a.password, b.text from users a 
    left join data b 
    on a.id = b.user_id 
    and b.field = 4 
    and a.id = 2; 

所需的輸出,以獲取信息的用戶提供的2 ID:

email | password | text 
'new2'  'pass'  

我目前沒有得到任何回報什麼我試過到目前爲止

+1

你的示例SQL中的from子句在哪裏?通過將where標準移到連接中,您應該從A中獲取所有記錄,並且只能從B中匹配那些與A.'AID = B.ID中的從左連接B匹配的記錄。 – xQbert

回答

0

條件第一個表中的一個left join進入where條款。在表條件去on子句中:

select u.email, u.password, d.text 
from users u left join 
    data d 
    on u.id = d.user_id and d.field = 4 
where a.id = 2; 

規則聽起來有點武斷。但事實並非如此。 left join返回第一個表中的所有行,而不管on子句的計算結果是否爲。因此,第一個表上的過濾條件不會過濾掉任何行。 where子句執行此過濾。

0

試試這個:

SELECT 
     u.email 
    , u.password 
    , r.text 

FROM 
    users AS u 

    LEFT JOIN report AS r 
     ON r.user_id = u.id 

WHERE 
    u.id = 2 
0

我不知道你正確粘貼查詢到你的問題,但如果我理解你以後,這應該工作:

SELECT a.email, a.password, b.text 
FROM users a 
LEFT JOIN report b ON a.id = b.user_id 
WHERE a.id = 2 

目前尚不清楚爲什麼你嘗試檢查對於b.field,但如果您需要這樣做,那麼請將其添加到LEFT JOIN。一般情況下,當您仍想要返回行時,將條件放在LEFT JOIN ... ON中,並在WHERE子句中放置條件,如果不滿足條件則不應返回行。