MySQL LEFT JOIN ON / WHERE

时间:2011-03-12 19:08:42

标签: mysql left-join

我正在将我的地址簿加入我的电子邮件表中,如下所示:

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等等的东西

但我一直都有错误。

有什么想法吗?

非常感谢!

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你需要使用AND而不是WHERE:

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

我认为你的第一次测试可能意味着=而不是LIKE,这会产生这样的结果:

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为非空,则相等测试将失败。

答案 1 :(得分: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))