Как я могу использовать левое соединение дважды в одном столбце с MySQL? - PullRequest
3 голосов
/ 09 июня 2009

У меня есть две таблицы, одна для аэропортов и одна для маршрутов.

Аэропорты выглядят примерно так

Airports
-------------------------------------
id | code | name                    |
-------------------------------------
01 | LGW  | London Gatwick          |
-------------------------------------
02 | LHR  | London Gatwick          |

и т. Д.

и еще один для таких маршрутов

Routes
---------------------------
id | ORIGIN | DESTINATION |
---------------------------
01 | LGW    | VCE         |
---------------------------
02 | TSF    | LHR         |

и так далее ...

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

SELECT routes.*, airports.name as origin_name FROM routes
LEFT JOIN airports ON airports.IATA = routes.origin
LEFT JOIN airports ON airports.IATA = routes.destination
WHERE origin = 'LHR' AND destination = 'VCE' OR origin = 'VCE'

Что вы можете или не можете знать, не работает. Как бы я поступил так?

Ответы [ 4 ]

14 голосов
/ 09 июня 2009

Использовать псевдонимы:

SELECT
    routes.*,
    a1.name AS origin_name,
    a2.name AS destination_name
FROM routes r
LEFT JOIN airports a1 ON a1.IATA = r.origin
LEFT JOIN airports a2 ON a1.IATA = r.destination
WHERE
    r.origin = 'LHR' AND r.destination = 'VCE' OR r.origin = 'VCE'
4 голосов
/ 09 июня 2009

Просто дайте таблице два разных псевдонима. Что-то вроде (не проверено);

SELECT routes.*, o.name as origin, d.name as destination FROM routes
LEFT JOIN airports o ON o.IATA = routes.origin
LEFT JOIN airports d ON d.IATA = routes.destination
WHERE origin = 'LHR' AND destination = 'VCE' OR origin = 'VCE'
3 голосов
/ 09 июня 2009

Вам нужно добавить таблицу AIRPORTS дважды, используя псевдонимы ....

SELECT ORIGIN_AIRPORT.NAME,
       DESTINATION_AIRPORT.NAME
FROM   AIRPORTS ORIGIN_AIRPORT,
       AIRPORTS DESTINATION_AIRPORT,
       ROUTES
WHERE  ROUTES.ORIGIN = ORIGIN_AIRPORT.CODE
AND    ROUTES.DESTINATION = DESTINATION_AIRPORT.CODE;
2 голосов
/ 09 июня 2009

Поместите псевдоним в имена таблиц:

SELECT routes.*, a1.name as origin_name FROM routes
LEFT JOIN airports AS a1 ON a1.IATA = routes.origin
LEFT JOIN airports AS a2 ON a2.IATA = routes.destination
WHERE origin = 'LHR' AND destination = 'VCE' OR origin = 'VCE'
...