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'
我正在努力锻炼: 如果我有三个连接表,即 表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'