Как вы объединяете внутреннее и внешнее соединение в mysql

Я могу сделать это в sybase, и я могу сделать это в Oracle, но я не вижу, как это сделать в mysql.

У меня есть это: (пожалуйста, воздержитесь от повторного форматирования моего sql, в прошлый раз, когда кто-то это сделал, они изменили его, поэтому он не был таким же и сделал вопрос бессмысленным)

select table1.id
from
table1
  inner join
    table2 on (table1.id = table2.id and table2.data='cat'),
table1 t1
  left outer join
    table3 on (t1.id = table3.id and table3.data = 'dog')

И я получаю всевозможные бессмысленные результаты.

Я хочу получить список всех идентификаторов из таблицы 1, где table2.data = cat, а затем выполнить внешнее соединение с результатами этого против таблицы 3, где table3.data = dog.

Я заметил, что я не могу указать одну и ту же таблицу / псевдоним для table1 в двух предложениях соединения, поэтому это наводит меня на мысль, что mysql запускает выражения соединения отдельно и объединяет результаты вместе или что-то в этом роде.

Я также попытался избавиться от "внутреннего соединения" в разделе from и поместить его в предложение where, это тоже не сработало, хотя и не сработало по-другому (были разные ошибочные результаты)

Это было бы так просто в sybase или oracle.

Что я делаю неправильно?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
4
0
11 282
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
select table1.id
from
table1
  inner join
    table2 on (table1.id = table2.id and table2.data='cat')
  left outer join
    table3 on (table1.id = table3.id and table3.data = 'dog')

Я думаю, вы никогда не захотите использовать запятую в операторе from. Я считаю, что запятая эквивалентна перекрестному соединению. Не уверен, но я думаю, что этот запрос - то, что вы ищете.

Используя синтаксис запятой, обычно вы можете предотвратить перекрестное соединение, задав условия в предложении WHERE.

Bill Karwin 08.01.2009 08:34

Правильно, вы не хотите смешивать синтаксис запятой (SQL-89) и синтаксис JOIN (SQL-92) в одном запросе. Хотя синтаксический анализатор позволяет это, это может вызвать запутанные взаимодействия, потому что запятая имеет более низкий приоритет, чем JOIN.

Bill Karwin 08.01.2009 08:35

Интересный способ взглянуть на это, но да, я полагаю, что запятая эквивалентна перекрестному соединению, которое, как сказал Билл, затем не пересекается соответствующими условиями соединения в предложении WHERE. Форма запятой предшествует нотации JOIN с большим отрывом. (И хорошо заметный, Шон!)

Jonathan Leffler 08.01.2009 09:12

Другие вопросы по теме