2015-01-25 2 views
0

Я пытаюсь работать: Если у меня есть три присоединились таблицы, т.е. TABLEA < -> TableB < -> tableCMySQL 3 таблицы присоединиться нулевые значения

Как всегда есть записи TABLEA и Значения NULL в B & C, если они не существуют? См http://www.sqlfiddle.com/#!9/65dd5/6

Второй пример не будет, естественно, возвращать ничего, и нет никаких подходящих идентификаторов в любом втором или третьих таблицах, но мне еще нужно, чтобы вернуть содержимое TableA

==== EDIT === ==

Не думаю, что я очень помогал в предоставлении информации. Виноват!.

Вот фактический запрос:

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.

(для этого в контексте, это для пользовательских полей формы, где я в основном определяю схему формы в определениях, тогда «если» страница имеет значения (которая является дочерней), а затем возвращает строки завершенными со значениями, в противном случае возвращают значения null).

Я ценю, что я могу пойти против того, что на самом деле предназначено JOIN?

+0

В идеале вы должны предоставить все детали, необходимые для ответа в самом вопросе, избегая ссылок на внешние ссылки. – h7r

ответ

1

Поместите условие на 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' 
+0

Aha! Вот и все. Genius. Спасибо. – Neokoenig

0

Вам необходимо указать left join со значениями tableA. Из запроса вы связаны, вы бы:

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, они будут показаны как хорошо.

+0

Я пересмотрел свой вопрос, так что это было не совсем то, чем я был, но спасибо за то, что вы нашли время для комментариев :) – Neokoenig

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. В противном случае он превратит внешние соединения во внутренние соединения.

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

+0

Я пересмотрел свой вопрос, так что это было очень близко к тому, что я был после, но спасибо за то, время для комментариев :) – Neokoenig

Смежные вопросы