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

如果未进行联接,则Mysql将列选择为null,mysql,join,null,Mysql,Join,Null,我有三张桌子 第一个是引用联系人的用户表 第二个是联系人行表,其中包含电子邮件地址和联系人的引用 第三个表包含信息,如何使用联系人行,以及它引用联系人行 在本例中,我试图从用户表中获取记录,并将emailaddress设置为它(如果它存在并且设置了正确的使用类型)。若联系人行为空或若未设置任何使用类型,则仍应返回结果,在此情况下,emailaddress应为null 表1 身份证 f_触点 表2 身份证 价值观 f_型 f_触点 表3 身份证 表2 f_型 当所有这些表中都有完整

我有三张桌子

  • 第一个是引用联系人的用户表
  • 第二个是联系人行表,其中包含电子邮件地址和联系人的引用
  • 第三个表包含信息,如何使用联系人行,以及它引用联系人行
在本例中,我试图从用户表中获取记录,并将emailaddress设置为它(如果它存在并且设置了正确的使用类型)。若联系人行为空或若未设置任何使用类型,则仍应返回结果,在此情况下,emailaddress应为null

表1

  • 身份证
  • f_触点
表2

  • 身份证
  • 价值观
  • f_型
  • f_触点
表3

  • 身份证
  • 表2
  • f_型
当所有这些表中都有完整的记录链时,它就会工作,但当表2没有任何记录或表3没有对表2的正确引用时,它不会返回任何内容

  • 表1总是有行
  • 表2可以有一行或多行
  • 表3可以有一个对表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 

将条件从
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 

将条件从
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 

如果看不到样本数据和期望的输出,很难判断,但您可以这样尝试

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 

这里是演示

如果没有看到样本数据和所需的输出,很难判断,但您可以这样尝试

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 

这是演示,它似乎返回了表1中的所有记录,而不是f_contact=1113的记录。此外,表3中具有其他f_类型的行也匹配。您只需将
table2
Table3
的条件移动到联接条件中即可。
Table1.f_contact=1113
应保留在
where
子句中。为了清楚起见,我还将
和Table2.f_type=2
移动到
Table2
的join子句中,而不是移动到
table3
的join子句中。这似乎返回了Table1中的所有记录,而不是f_contact=1113的记录。此外,表3中具有其他f_类型的行也匹配。您只需将
table2
Table3
的条件移动到联接条件中即可。
Table1.f_contact=1113
应保留在
where
子句中。为了清楚起见,我还将
和Table2.f_type=2
移动到
Table2
的join子句中,而不是移动到
table3
的join子句中。这几乎可以解决问题。它返回一行,其中emailaddress的值为空,具体取决于具体情况。但是,当表3中没有引用记录时,emailaddress应该始终为null。在这种情况下,所需的输出是:id=>int,f_contact=>int,emailaddress=>null或stringgast。如果Table3.f_type设置为2,则此操作失败。在这种情况下根本没有行。我已经发布了一个sqlfiddle示例。更改示例数据以显示您的问题,单击
buildschema
并在此处发布链接。该死。你是对的。我的问题是,我试图在查询的末尾添加一些废话,并将其留在那里。通过复制/粘贴您的查询建议,它就像一个符咒。谢谢!这几乎把它钉死了。它返回一行,其中emailaddress的值为空,具体取决于具体情况。但是,当表3中没有引用记录时,emailaddress应该始终为null。在这种情况下,所需的输出是:id=>int,f_contact=>int,emailaddress=>null或stringgast。如果Table3.f_type设置为2,则此操作失败。在这种情况下根本没有行。我已经发布了一个sqlfiddle示例。更改示例数据以显示您的问题,单击
buildschema
并在此处发布链接。该死。你是对的。我的问题是,我试图在查询的末尾添加一些废话,并将其留在那里。通过复制/粘贴您的查询建议,它就像一个符咒。谢谢!