2011-03-12 103 views
0

我加入我的地址簿到我的郵箱表是這樣的:的MySQL LEFT JOIN ON/WHERE

SELECT * FROM messages m 
LEFT JOIN addr_book a ON 
m.to_msg LIKE a.h_email 
OR m.to_msg LIKE a.bill_email 
OR m.to_msg LIKE a.b_email 
OR m.to_msg LIKE a.w_email 
OR m.to_msg LIKE a.other_email 
OR m.from_msg LIKE a.h_email 
OR m.from_msg LIKE a.bill_email 
OR m.from_msg LIKE a.b_email 
OR m.from_msg LIKE a.w_email 
OR m.from_msg LIKE a.other_email 
OR m.cc_msg LIKE a.h_email 
OR m.cc_msg LIKE a.bill_email 
OR m.cc_msg LIKE a.b_email 
OR m.cc_msg LIKE a.w_email 
OR m.cc_msg LIKE a.other_email 
OR m.bcc_msg LIKE a.h_email 
OR m.bcc_msg LIKE a.bill_email 
OR m.bcc_msg LIKE a.b_email 
OR m.bcc_msg LIKE a.w_email 
OR m.bcc_msg LIKE a.other_email 

問題是,它取一切,因爲某些聯繫人沒有電子郵件,並與電子郵件加入了該沒有cc_msg =「」或bcc_msg =「」

有沒有一種方法可以讓我離開加入表上的列,其中列就像是「@」?

我試過幾件事情像IN (m.to_message LIKE a.h_email WHERE a.h_email LIKE '%@%') OR等等等等

但我不斷收到錯誤。

任何想法?

謝謝!

+4

爲什麼你用'LIKE b'而不是'a = b'? –

+0

因爲有些用戶保存在帽它(如[email protected])的電子郵件和消息表只包含小寫。 –

+2

你需要閱讀有關[規範化](http://en.wikipedia.org/wiki/Normalization_%28database%29)。您應該有一個包含用戶標識,地址類型和地址的單獨表格,而不是針對不同類型的電子郵件地址具有多列。然後,您可以輕鬆加入(並搜索)匹配的電子郵件地址。 –

回答

0

好,使很多幫助了。我不知道爲什麼,但我一直認爲=在mySQL中區分大小寫。我使用了以下內容,效果非常好。謝謝大家,我確信如果我有適當的訓練,我不會在第一個地方犯這個錯誤。

LEFT JOIN addr_book a ON 

(m.to_msg=a.h_email OR m.to_msg=a.bill_email OR m.to_msg=a.b_email OR m.to_msg=a.w_email OR m.to_msg=a.other_email) OR 

(m.from_msg=a.h_email OR m.from_msg=a.bill_email OR m.from_msg=a.b_email OR m.from_msg=a.w_email OR m.from_msg=a.other_email) OR 

((m.cc_msg!='') AND (m.cc_msg=a.h_email OR m.cc_msg=a.bill_email OR m.cc_msg=a.b_email OR m.cc_msg=a.w_email OR m.cc_msg=a.other_email)) OR 

((m.bcc_msg!='') AND (m.bcc_msg=a.h_email OR m.bcc_msg=a.bill_email OR m.bcc_msg=a.b_email OR m.bcc_msg=a.w_email OR m.bcc_msg=a.other_email)) 
+0

爲區分大小寫,你可以使用LOWER或LCASE或一些這樣的事情。 – Dave

+0

請學習如何格式化SQL或代碼。你可以使用編輯器上的按鈕(看起來像一個圓形方框),每行縮進四個空格,或選擇所有的代碼/ SQL,然後使用Ctrl + Shift + K。謝謝。 :) –

0

如果我理解你的問題,你需要使用AND代替WHERE:

ON (m.to_message LIKE a.h_email AND a.h_email LIKE '%@%') OR (... 

我想你可能意味着=,而不是像第一次測試,這將使本:

ON (m.to_message = a.h_email AND a.h_email LIKE '%@%') OR (... 

或許你只是需要這樣的:

ON m.to_message = a.h_email 

與LIKE等同性測試將失敗,如果a.h_email爲空,但m.to_message非空。

+0

但是,如果地址簿電子郵件中有任何大寫,平等將會失敗。消息表格只有小寫字母,但如果用戶選擇,地址簿可能會有大寫字母。我想避免在查詢之前加載聯繫人並強制電子郵件降低。 –

+0

好吧,所以=是def不區分大小寫,因爲我假設..我會嘗試你以上的.. –