MySQL 3表连接空值

时间:2015-01-25 17:06:27

标签: mysql join subquery

我正在尝试解决: 如果我有三个连接表,即 表A< - > tableB的< - >表C

如果它们不存在,如何在B& C中始终拥有tableA的记录和NULL值? 见http://www.sqlfiddle.com/#!9/65dd5/6

第二个示例自然不会返回任何内容,并且第二个或第三个表中没有匹配的ID,但我仍然需要返回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 

因此,如果我有连接条目的记录,那就没关系。

然而,我真正需要的是(在伪代码中)IF cf_joins.cf_childid不存在,仍然从cf_definitions返回记录。

(把它放在上下文中,这是自定义表单字段,其中我基本上定义了定义中的表单模式,然后'if'页面有值(这是childid),然后返回完成的行值,否则返回空值)。

我很欣赏我可能会反对JOIN的实际意图吗?

4 个答案:

答案 0 :(得分:1)

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

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'

答案 1 :(得分:0)

您需要来自tableA值的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相关的空值,它们也将显示。

答案 2 :(得分:0)

您需要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(第一个表)上的条件保留在WHERE子句中。 table2上的条件需要进入on子句。否则,它会将外连接转换为内连接。

答案 3 :(得分:0)

试试这个:

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

中的结果