¿Cómo uso Left Join dos veces en la misma columna con MySQL?
Pregunta
Tengo dos tablas, una para aeropuertos y otra para rutas.
Los aeropuertos se parecen un poco a esto.
Airports
-------------------------------------
id | code | name |
-------------------------------------
01 | LGW | London Gatwick |
-------------------------------------
02 | LHR | London Gatwick |
etcétera....
y otro para rutas como esta
Routes
---------------------------
id | ORIGIN | DESTINATION |
---------------------------
01 | LGW | VCE |
---------------------------
02 | TSF | LHR |
etcétera...
Necesito seleccionar rutas de la tabla, pero también quiero obtener los nombres de los aeropuertos.Lo confuso es que necesito consultar el código del aeropuerto dos veces.Estoy intentando algo como esto
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'
Lo que quizás sepas o no, no funciona.¿Cómo haría para hacer esto?
Solución
Use alias:
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'
Otros consejos
Sólo dar la mesa dos alias diferentes. Algo así como (no probado);
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'
Es necesario añadir la tabla AEROPUERTOS dos veces utilizando alias ....
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;
Ponga un alias en los nombres de tablas:
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'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow