Как сделать INNER JOIN на нескольких столбцах

Я работаю над домашним проектом, и я должен выполнить запрос к базе данных, который находит полеты либо по названию города, либо по коду аэропорта, но таблица flights содержит только коды аэропорта, поэтому, если я хочу поиск по городу Мне нужно присоединиться к таблице airports.

Таблица аэропортов имеет следующие столбцы: code, city
Таблица рейсов имеет следующие столбцы: airline, flt_no, fairport, tairport, depart, arrive, fare
Столбцами fairport и tairport являются коды аэропорта от и до.
Столбцы depart и arrive - это даты отправления и прибытия.

Я придумал запрос, который сначала соединяет полеты в столбце fairport и столбце airports.code. Для того чтобы я мог соответствовать tairport, мне нужно выполнить другое соединение в предыдущих совпадениях из первого соединения.

SELECT airline, flt_no, fairport, tairport, depart, arrive, fare
    FROM (SELECT * FROM flights
        INNER JOIN airports
        ON flights.fairport = airports.code
        WHERE (airports.code = '?' OR airports.city='?')) AS matches
    INNER JOIN airports
    ON matches.tairport = airports.code
    WHERE (airports.code = '?' OR airports.city = '?')

Мой запрос возвращает правильные результаты, и этого будет достаточно для домашней работы, но мне интересно, могу ли я JOIN на нескольких столбцах? Как мне построить предложение WHERE, чтобы оно соответствовало месту отправления и города назначения?

Ниже приведен псевдо-запрос на то, что я хочу добиться, но я не могу правильно получить синтаксис, и я не знаю, как представить таблицу airports для отправлений и пунктов назначения:

SELECT * FROM flights
INNER JOIN airports
ON flights.fairport = airports.code AND flights.tairport = airports.code
WHERE (airports.code = 'departureCode' OR airports.city= 'departureCity') 
    AND (airports.code = 'destinationCode' OR airports.city = 'destinationCity')

Update

Я также нашел это визуальное представление операторов SQL Join, чтобы быть very полезным как общее руководство о том, как создавать инструкции SQL!

Ответ 1

Вы можете ПРИСОЕДИНИТЬСЯ с одной и той же таблицей несколько раз, предоставив объединенным таблицам alias, как показано в следующем примере:

SELECT 
    airline, flt_no, fairport, tairport, depart, arrive, fare
FROM 
    flights
INNER JOIN 
    airports from_port ON (from_port.code = flights.fairport)
INNER JOIN
    airports to_port ON (to_port.code = flights.tairport)
WHERE 
    from_port.code = '?' OR to_port.code = '?' OR airports.city='?'

Обратите внимание, что to_port и from_port являются псевдонимами для первой и второй копий таблицы airports.

Ответ 2

что-то вроде....

SELECT f.*
      ,a1.city as from
      ,a2.city as to
FROM flights f
INNER JOIN airports a1
ON f.fairport = a1. code
INNER JOIN airports a2
ON f.tairport = a2. code

Ответ 3

если mysql подходит для вас:

SELECT flights.*, 
       fromairports.city as fromCity, 
       toairports.city as toCity
FROM flights
LEFT JOIN (airports as fromairports, airports as toairports)
ON (fromairports.code=flights.fairport AND toairports.code=flights.tairport )
WHERE flights.fairport = '?' OR fromairports.city = '?'

edit: добавлен пример для фильтрации вывода для кода или города

Ответ 4

Можете ли вы просто использовать и в разделе on?

Например, что-то вроде:

SELECT 
   airline, flt_no, fairport, tairport, depart, arrive, fare
FROM 
   flights
INNER JOIN 
   airports from_port ON (from_port.code = flights.fairport)
   and (to_port.code = flights.tairport)

Ответ 5

Если вы хотите выполнить поиск в обоих аэропортах FROM и TO, вам нужно дважды присоединиться к таблице аэропортов, тогда вы можете использовать как таблицы, так и таблицы в своем наборе результатов:

SELECT
   Flights.*,fromAirports.*,toAirports.*
FROM
   Flights
INNER JOIN 
   Airports fromAirports on Flights.fairport = fromAirports.code
INNER JOIN 
   Airports toAirports on Flights.tairport = toAirports.code
WHERE
 ...