Вы не получаете декартово произведение. Вы получаете именно то, о чем вы просите: результат 2 внешних соединений.
Возможно, вы этого еще не осознали, но вы ожидаете, что 2 соединения объединяются поперечно вместе, чтобы дать вам только 2 записи, магически зная, что идентификатор таблицы B должен отображаться на идентификатор таблицы C. Это фактически возможно который вам понравится, но это намного сложнее, чем вы думаете (см. подсказку в mysql для получения дополнительной информации, но это всего лишь пример того, как это сделать).
Скорее я покажу вам вашу проблему.
- Вы просите A внешнего соединения B. Результат 2 записи, потому что кажется, есть 2 записей в таблице В с id_a = 2. Промежуточный подсчет результирующего равен 2.
- Вы спрашиваете для Внешнего соединения C. Аналогично, результат равен 2 записям, поскольку, как представляется, в таблице C также есть 2 записи с id_a = 2. Промежуточный результат является 2.
Но вы не просите mysql ничего о том, как организовать/объединить эти 2 промежуточных результирующих набора. Поэтому mysql пересекает их вместе, что, возможно, заставило вас изначально подумать, что это декартовый продукт, и отображает конечный результат, который вы наблюдали. Всего строк = 4, 2 из 1-го результирующего набора, раз 2, из 2-го результирующего набора.
Декартовой продукт включал бы все записи всех трех таблиц, скрещенных друг с другом: раз b раз c.
Итак, в заключение, можно «взломать» запрос, чтобы показать, как вы хотите, путем установления стыковка критериев между С и В. Например:
SELECT *
FROM test.a as tableA
LEFT JOIN test.b tableB ON tableB.id_a = tableA.id
LEFT JOIN test.c tableC ON tableC.id_a = tableA.id AND tableC.id = tableB.id
;
Но на самом деле это хак, вы, вероятно, необходимо определить более высокий критерий, чем технический идентификатор идентификатора.
Какой результат вы ожидали? Я имею в виду - как выглядели бы ожидаемые две строки? –
Вы действительно не можете присоединиться к нескольким таблицам, разделяющим «множественное» отношение к одной и той же таблице ... по крайней мере, не без серьезных головных болей и запутанных запросов.Вы можете посмотреть на это как на то, что второе соединение эффективно соединяется с результатами первого объединения. – Uueerdo
вы присоединяетесь к отношениям «один ко многим», поэтому у вас есть частичный декартовой продукт – FuzzyTree