【问题标题】:MySQL 3 table join with null values具有空值的 MySQL 3 表连接
【发布时间】:2015-01-25 17:06:26
【问题描述】:

我正在努力解决: 如果我有三个连接表,即 表A表B表C

如果 tableA 的记录和 NULL 值不存在,如何在 B&C 中始终拥有它们? 见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 

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

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

(将其放在上下文中,这是用于自定义表单字段,我本质上是在定义中定义表单架构,然后“如果”页面具有值(即 childid),然后返回完整的行值,否则返回空值)。

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

【问题讨论】:

  • 理想情况下,您应该在问题本身中提供答案所需的所有详细信息,避免异地参考。

标签: mysql join subquery


【解决方案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'

【讨论】:

  • 啊哈!就是这样。天才。谢谢。
【解决方案2】:

您需要来自 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 的空值,它们也会显示出来。

【讨论】:

  • 我修改了我的问题,所以这不是我想要的 - 但感谢您抽出宝贵时间发表评论:)
【解决方案3】:

你想要一个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 子句。否则,它将把外连接变成内连接。

【讨论】:

    【解决方案4】:

    试试这个:

    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中的结果

    【讨论】:

    • 我修改了我的问题,所以这与我所追求的非常接近 - 但感谢您抽出宝贵时间发表评论:)
    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 2011-07-22
    • 2010-12-12
    • 2011-11-23
    • 1970-01-01
    相关资源
    最近更新 更多