#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, но никаких ограничений (ни прямых, ни косвенных) на отели и маршруты. Вот почему вы видели все идентификаторы поездки