Скажем, у меня есть три таблицы, A, B и C. Концептуально A (опционально) имеет одну B, а B (всегда) имеет одну C.
Table A:
a_id
... other stuff
Table B:
a_fk_id (foreign key to A.a_id, unique, primary, not null)
c_fk_id (foreign key to C.c_id, not null)
... other stuff
Table C:
c_id
... other stuff
Я хочу выбрать Все записи из Aа также связанные с ними записи из B и C, если таковые имеются.Однако данные B и C должны появляться в результате только в том случае, если присутствуют B и C.
Я чувствую, что хочу сделать:
SELECT *
FROM
A
LEFT JOIN B on A.a_id=B.a_fk_id
INNER JOIN C on B.c_fk_id=C.c_id
Но объединения, похоже, осталисьассоциативно (первое соединение происходит перед вторым соединением), поэтому это не даст записи из A, у которых нет записи в C.
AFAICT Я должен использовать подзапросы, что-то вроде:
SELECT *
FROM
A
LEFT JOIN (
SELECT * FROM B INNER JOIN C ON B.c_fk_id=C.c_id
) as tmp ON A.id = tmp.a_fk_id
но как только у меня есть пара таких отношений в запросе (в действительности у меня может быть два или три вложенных), я беспокоюсь как о сложности кода, так и об оптимизаторе запросов.
Есть ли способ указать порядок соединения, кроме этого метода подзапроса?
Спасибо.