我正在尝试解决: 如果我有三个连接表,即 表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的实际意图吗?
答案 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
中的结果