MySQL INNER JOIN возвращает все строки

#mysql #inner-join

#mysql #внутреннее соединение

Вопрос:

У меня есть две таблицы «отели» и «рейсы», в которых есть поле «typeId», которое ссылается на внешний ключ таблицы «маршруты» «id». Например: hotel.foreign(‘tripID’).references(‘id’).InTable(‘маршруты’);

Я хочу выбрать все строки из каждой таблицы, у которых идентификатор маршрута равен 3. Я попробовал следующее, но я получаю все идентификаторы в маршруте, а не только 3.

 SELECT itineraries.* , hotels.* , flights.* 
FROM itineraries 
INNER JOIN hotels ON hotels.tripId = itineraries.id 
INNER JOIN flights ON flights.tripIid = 3
  

Комментарии:

1. Для каждого внутреннего присоединения к отелям… вы добавляете все строки из рейсов, где tripIid=3, это декартово СОЕДИНЕНИЕ, а не ВНУТРЕННЕЕ

Ответ №1:

Вы также должны управлять внутренним соединением для рейсов и фильтровать по where для tripIid = 3

 SELECT itineraries.* , hotels.* , flights.* 
FROM itineraries 
INNER JOIN hotels ON hotels.tripId = itineraries.id 
INNER JOIN flights ON flights.tripIid = itineraries.id 
WHERE  flights.tripIid = 3
  

для вас последний комментарий

Как я могу отредактировать это, чтобы оно по-прежнему возвращало все строки, если есть отель с соответствующим идентификатором поездки, но нет рейсов?

вы должны использовать левое соединение

 SELECT itineraries.* , hotels.* , flights.* 
FROM itineraries 
INNER JOIN hotels ON hotels.tripId = itineraries.id 
LEFT JOIN flights ON flights.tripIid = itineraries.id 
WHERE  hotels.tripId = 3
  

Комментарии:

1. Спасибо!! Это сработало! Как я могу отредактировать это, чтобы оно по-прежнему возвращало все строки, если есть отель с соответствующим идентификатором поездки, но нет рейсов?

2. Почему вы изменили принятый ответ .. тот же, и я ответил первым .. несправедливо

3. Извините, это была случайность — я исправил это

4. спасибо .. лучше объясните ваш предыдущий комментарий .. не ясно, чего вы хотите..

5. Я обновил asnwer .. думаю, что левое соединение — это то, что вам нужно.

Ответ №2:

Ваш запрос должен быть:

 SELECT itineraries.* , hotels.* , flights.* 
FROM itineraries 
INNER JOIN hotels ON hotels.tripId = itineraries.id 
INNER JOIN flights ON flights.tripId=itineraries.Id 
Where flights.TripId= 3
  

В вашем оригинале вы ограничивали полеты. tripID должен быть равен 3, но никаких ограничений (ни прямых, ни косвенных) на отели и маршруты. Вот почему вы видели все идентификаторы поездки