2013-08-03 3 views
0

Я пытаюсь объединить три отдельных запроса в один. Каждый запрос выбирает другой столбец из другой таблицы, но в таблицах есть несколько столбцов.MySQL LEFT JOIN - Как все еще вернуть результаты, когда крайняя левая таблица пуста?

То, что я пробовал делать, было ВЛЕВО ПРИСОЕДИНИТЬСЯ к двум таблицам в другую, и это отлично работает, пока крайняя левая таблица возвращает результат. Но если крайняя левая таблица не возвращает результат, то результат не возвращается вообще (даже если оба запроса LEFT JOINed имеют результаты).

псевдокод:

SELECT a.col_1, b.col_2, c.col_3 
FROM tableA a 
LEFT JOIN tableB b ON b.someCol = a.someCol 
LEFT JOIN tableC c ON c.someCol = a.someCOL 
WHERE a.anotherCol = :someVal AND a.yetAnotherCol = :anotherVal 

Если TABLEA есть результат, то результат запроса, что я хотел (т.е. он возвращает три столбца с col_1, col_2 | утратившим col_3 | нулем). Но если tableA не имеет результата, тогда запрос возвращает null.

Есть ли способ вернуть результаты, когда крайняя левая таблица в строке LEFT JOINs не имеет результата?

ответ

3

У вас возникли проблемы. left join хранит все в первой таблице. Похоже, вы хотите нечто вроде full outer join, которое MySQL не поддерживает. Но есть прекрасное обходное решение.

Это sonds как ваш запрос имеет вид:

select . . . 
from t1 left join 
    t2 
    on t1.t1id = t2.t1id left join 
    t3 
    on t1.t1id = t3.t1id; 

Захвати все идентификаторы вместе, а затем сделать стыки:

select . . . 
from (select t1id 
     from ((select t1id from t1) union 
      (select t1id from t2) union 
      (select t1id from t3) 
      ) driver left join 
      t1 
      on t1.t1id = driver.t1id left join 
      t2 
      on t2.t1id = driver.t1id left join 
      t3 
      on t3.t1id = driver.t1id; 
    ) 

driver будет состоять из всех «t1» ид которые вы хотите получить из других таблиц. Он может не включать все таблицы, потому что некоторые из них могут соединяться с другими идентификаторами.

И, union в подзапросе driver намеренно. Вы хотите удалить дубликаты.

+0

+1 Просто хотел вставить свой ответ, но увидел, что вы сделали это сначала :) – peterm

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