如果未进行联接,则Mysql将列选择为null
我有三张桌子如果未进行联接,则Mysql将列选择为null,mysql,join,null,Mysql,Join,Null,我有三张桌子 第一个是引用联系人的用户表 第二个是联系人行表,其中包含电子邮件地址和联系人的引用 第三个表包含信息,如何使用联系人行,以及它引用联系人行 在本例中,我试图从用户表中获取记录,并将emailaddress设置为它(如果它存在并且设置了正确的使用类型)。若联系人行为空或若未设置任何使用类型,则仍应返回结果,在此情况下,emailaddress应为null 表1 身份证 f_触点 表2 身份证 价值观 f_型 f_触点 表3 身份证 表2 f_型 当所有这些表中都有完整
- 第一个是引用联系人的用户表
- 第二个是联系人行表,其中包含电子邮件地址和联系人的引用
- 第三个表包含信息,如何使用联系人行,以及它引用联系人行李>
- 身份证
- f_触点
- 身份证
- 价值观
- f_型
- f_触点
- 身份证
- 表2
- f_型
- 表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
并在此处发布链接。该死。你是对的。我的问题是,我试图在查询的末尾添加一些废话,并将其留在那里。通过复制/粘贴您的查询建议,它就像一个符咒。谢谢!