MySQL 3 table 加入空值

MySQL 3 table join with null values

我正在努力锻炼: 如果我有三个连接表,即 表A<-->表B<-->表C

如果表A的记录和B&C中不存在的NULL值如何始终存在? 参见 http://www.sqlfiddle.com/#!9/65dd5/6

第二个例子自然return什么都没有,第二张表和第三张表都没有匹配的ID,但我还是需要return TableA的内容

==== 编辑 =====

我认为我在提供信息方面帮助不大。我的错!.

这是实际查询:

SELECT
    cf_definitions.id,
    cf_definitions.`name`,
    cf_definitions.parentmodel,
    cf_definitions.type,
    cf_definitions.`options`,
    cf_definitions.class,
    cf_definitions.description,
    cf_joins.cf_definitionid,
    cf_joins.cf_childid,
    cf_joins.cf_valueid,
    cf_values.id,
    cf_values.`value`
FROM
    cf_definitions
LEFT JOIN cf_joins ON cf_joins.cf_definitionid = cf_definitions.id
LEFT JOIN cf_values ON cf_joins.cf_valueid = cf_values.id
WHERE
    cf_definitions.parentmodel = 'location' AND cf_joins.cf_childid = 1 

因此,如果我有包含连接条目的记录,那就没问题了。

然而,我真正需要的是(在伪代码中)如果 cf_joins.cf_childid 不存在,仍然 return 来自 cf_definitions 的记录。

(为了说明这一点,这是针对自定义表单字段的,我基本上是在定义中定义表单架构,然后 'if' 页面具有值(即 childid),然后 return 行用值完成,否则 return 空值)。

我很感激我可能违背了 JOIN 的实际意图?

您需要来自表 A 的值的 left join。 从您链接到的查询中,您将拥有:

SELECT
    table1.id AS FormID,
    table1.`name` AS FormName,
    table1.model AS FormModel,
    table2.anotherid,
    table2.table1id,
    table2.table3id,
    table3.id AS FormValueID, 
    table3.`name` AS FormValue
FROM table1
    LEFT JOIN table2 ON table2.table1id = table1.id
    LEFT JOIN table3 ON table2.table3id = table3.id
WHERE table1.model = 'example1' AND anotherid = 2;

请注意,如果 table2 具有与 table3 相关的空值,它们也会显示。

你想要 left join:

select . . .
FROM table1 t1 LEFT JOIn
     table2 t2
     ON t2.table1id = t1.id AND t2.anotherid = 2 LEFT JOIN
     table3 t3
     ON t2.table3id = t3.id
WHERE t1.model = 'example1' 

一个微妙之处是拆分 WHERE 条件。 table1(第一个 table)的条件保留在 WHERE 子句中。 table2 的条件需要进入 on 子句。否则,它将把外连接变成内连接。

试试这个:

SELECT T1.*,
T2.*
FROM Table1 T1
LEFT JOIN
(SELECT table1.id AS FormID,
 table1.`name` AS FormName,
 table1.model AS FormModel,
 table2.anotherid,
 table2.table1id,
 table2.table3id,
 table3.id AS FormValueID, 
 table3.`name` AS FormValue
 FROM table1
 INNER JOIN table2 ON table2.table1id = table1.id
 INNER JOIN table3 ON table2.table3id = table3.id
 WHERE table1.model = 'example1' AND anotherid = 1) T2 ON T2.FormID=T1.id

结果:

ID  NAME        MODEL       FORMID  FORMNAME    FORMMODEL   ANOTHERID   TABLE1ID    TABLE3ID    FORMVALUEID FORMVALUE
1   Thing One   example1    1       Thing One   example1    1           1           1           1           Value One
2   Thing Two   example1    2       Thing Two   example1    1           2           2           2           Value Two
3   Thing Three example1    3       Thing Three example1    1           3           3           3           Value Three
4   Thing Four  example1    4       Thing Four  example1    1           4           4           4           Value Four
5   Thing Five  example2    (null)  (null)      (null)      (null)      (null)      (null)      (null)      (null)
6   Thing Six   example2    (null)  (null)      (null)      (null)      (null)      (null)      (null)      (null)
7   Thing Seven example3    (null)  (null)      (null)      (null)      (null)      (null)      (null)      (null)
8   Thing Eight example3    (null)  (null)      (null)      (null)      (null)      (null)      (null)      (null)

结果见Sql Fiddle

将条件放在 JOIN 上,而不是它们是:

SELECT
    cf_definitions.id,
    cf_definitions.`name`,
    cf_definitions.parentmodel,
    cf_definitions.type,
    cf_definitions.`options`,
    cf_definitions.class,
    cf_definitions.description,
    cf_joins.cf_definitionid,
    cf_joins.cf_childid,
    cf_joins.cf_valueid,
    cf_values.id,
    cf_values.`value`
FROM
    cf_definitions
LEFT JOIN cf_joins ON cf_joins.cf_definitionid = cf_definitions.id AND cf_joins.cf_childid = 1 
LEFT JOIN cf_values ON cf_joins.cf_valueid = cf_values.id
WHERE
    cf_definitions.parentmodel = 'location'