Внешнее соединение MySQL с присоединенной таблицей, имеющей зависимости от более чем одной таблицы

У меня есть 3 таблицы A, B и T

T содержит внешний ключ к таблицам A и B соответственно.

Теперь я хотел бы получить все строки (A, B, T), даже если T пуст.

SELECT * from

A
LEFT OUTER JOIN T t1 ON t1.A_ID = A.id,
B
LEFT OUTER JOIN T t2 ON t2.B_ID = B.id

WHERE A.B_ID = B.ID

Теперь проблема в том, что я получаю слишком много строк, поэтому я добавляю следующее:

AND t1.id = t2.id

Но теперь я вообще не получаю строк, которых я пытался избежать в первую очередь, включив LEFT OUTER JOIN.

РЕДАКТИРОВАТЬ: Помимо любых выборочных данных или макета таблицы, мой вопрос заключается просто в том, если таблица T с зависимостями внешнего ключа от более чем ОДНОЙ таблицы в этом случае A + B нуждается в 2 левых внешних соединениях, как указано выше, или, может быть, там есть другой способ?

Простая ссылка на таблицу A во втором левом соединении, как предлагали некоторые пользователи, не может работать, поскольку она выходит за рамки, также объясняется здесь
Таким образом, это работает, если вы окружите обе таблицы скобками:

SELECT * from (A, B)
LEFT OUTER JOIN T t ON t.A_ID = A.id and t.B_ID = B.id

person recalcitrant    schedule 04.01.2012    source источник
comment
Возможно, я неправильно понял, но какова цель A.B_ID = B.ID? Не могли бы вы опубликовать определения таблиц и примеры данных?   -  person Neville Kuyt    schedule 04.01.2012
comment
Вы можете попробовать что-то вроде этого: stackoverflow.com/ вопросы/4796872/полное-внешнее-присоединение-в-mysql   -  person Tim Lehner    schedule 04.01.2012
comment
Ради вашего собственного здравомыслия (и в некоторой степени нашего), пожалуйста, не смешивайте обозначения , и JOIN. Попробуйте использовать один, предпочтительно JOIN. Кроме того, вы можете () части вашего запроса, такие как (A LEFT JOIN T ON ???) INNER JOIN (B LEFT JOIN T ON ???) ON ???   -  person MatBailie    schedule 04.01.2012
comment
Как мы можем использовать A.B_ID = B.ID, если обе таблицы не имеют никакого отношения? Вы указали, что T содержит внешний ключ для таблиц A и B.   -  person Somnath Muluk    schedule 04.01.2012
comment
Можете ли вы предоставить немного больше информации - структуру таблицы и ожидаемый результат. Из вопроса не ясно, связаны ли A и B. Если нет, хотите ли вы декартово произведение?   -  person StevieG    schedule 04.01.2012


Ответы (3)


Попробуйте этот запрос: если A и B не имеют никакого отношения:

SELECT * FROM
(A, B)
LEFT OUTER JOIN T ON T.A_ID = A.id
AND T.B_ID = B.id

И если A и B имеют отношения, добавьте эту строку, наконец:

WHERE A.B_ID = B.ID
person Somnath Muluk    schedule 04.01.2012
comment
Я не думаю, что это может работать, поскольку A.id неизвестен во внешнем соединении. Вы указываете таблицу-B ПОСЛЕ таблицы-A - person recalcitrant; 04.01.2012
comment
я проверил это. оно работает. если ваша структура таблицы такая, как вы указали. - person Somnath Muluk; 04.01.2012
comment
Ваше решение работает, если я окружаю A, B скобками => (A, B). Возможно, это обязательно в MySQL - person recalcitrant; 04.01.2012
comment
О... Извините.. Спасибо. Я изменил свое решение. Скобки должны быть. - person Somnath Muluk; 04.01.2012

Пытаться

select *
from A
join B on A.B_ID = B.ID
left join T on T.A_ID = a.id and T.B_ID = b.id

.. при условии, что я правильно понял ваш вопрос, и вы намерены использовать обычное внутреннее соединение между A и B

person rejj    schedule 04.01.2012
comment
Как мы можем использовать A.B_ID = B.ID, если обе таблицы не имеют никакого отношения? T содержит внешний ключ к таблицам A и B. - person Somnath Muluk; 04.01.2012
comment
Предложение WHERE в исходном вопросе подразумевает отношение между A и B. - person rejj; 04.01.2012
comment
+1, хотя я несколько не уверен, должно ли второе предложение ON связывать два сравнения с AND или с OR. - person Andriy M; 05.01.2012

Если я правильно понял, то, может быть, это сработает для вас?

SELECT * from
A
LEFT OUTER JOIN T t1 ON t1.A_ID = A.id,
B
LEFT OUTER JOIN T t2 ON (t2.B_ID = B.id AND t1.id = t2.id)

WHERE A.B_ID = B.ID
person Community    schedule 04.01.2012
comment
Это проблема, которую я пытаюсь решить: t1.id неизвестен во втором ЛЕВОМ ВНЕШНЕМ СОЕДИНЕНИИ. - person recalcitrant; 04.01.2012
comment
Упс, извините, не заметил запятую... Может тогда SELECT * from A LEFT OUTER JOIN T t1 ON t1.A_ID = A.id LEFT OUTER JOIN B ON (t1.B_ID = B.id AND A.B_ID = Б.ИД) поможет - person ; 04.01.2012
comment
но все же, какая связь между A И B? - person ; 04.01.2012