如果未进行连接,则Mysql将列选为null

时间:2014-01-12 08:23:52

标签: mysql join null

我有3张桌子。

  • 第一个是引用联系人的用户表。
  • 其次是联系人行表,其中包含电子邮件地址和对联系人的引用。
  • 第三个表包含信息,联系行的使用方式以及联系行的引用。

在这种情况下,我正在尝试从用户表中获取记录,并将emailaddress设置为它,如果它存在并且设置了正确的使用类型。如果联系行为空或未设置使用类型,则仍应返回结果,在这种情况下,emailaddress应为null。

表1

  • ID
  • f_contact

表2

  • ID
  • F_TYPE
  • f_contact

表3

  • ID
  • table2_id
  • F_TYPE

每当所有这些表中的记录都有完整链时,它就可以工作,但是当表2没有任何记录或表3没有正确引用Table2时,它什么也不返回。

  • 表1始终有行
  • 表2可以有一行或多行
  • 表3可以有1个参考表2行

我现在拥有的是:

SELECT 
  Table1.*,
  Table2.value AS emailaddress 
FROM
  Table1 
  LEFT JOIN Table2 
    ON Table2.f_contact = Table1.f_contact 
  LEFT JOIN Table3 
    ON Table3.table2_id = Table2.id 
WHERE Table1.f_contact = 1113 
  AND Table2.f_type = 2 
  AND Table3.f_type = 3 

2 个答案:

答案 0 :(得分:3)

将条件从where子句移至ON子句

SELECT 
  Table1.*,
  Table2.value AS emailaddress 
FROM
  Table1 
  LEFT JOIN Table2 
    ON Table2.f_contact = Table1.f_contact  AND Table1.f_contact = 1113 
  LEFT JOIN Table3 
    ON Table3.table2_id = Table2.id AND Table2.f_type = 2 AND Table3.f_type = 3 

答案 1 :(得分:1)

在没有看到样本数据和所需输出的情况下很难分辨,但你可以这样尝试

SELECT 
  Table1.*,
  CASE WHEN Table3.f_type IS NULL THEN NULL ELSE Table2.value END AS emailaddress 
FROM
  Table1 
  LEFT JOIN Table2 
    ON Table2.f_contact = Table1.f_contact 
   AND Table2.f_type = 2 
  LEFT JOIN Table3 
    ON Table3.table2_id = Table2.id 
   AND Table3.f_type = 3 
WHERE Table1.f_contact = 1113 

这是 SQLFiddle 演示