Cómo hacer una UNIÓN INTERNA en múltiples columnas
Estoy trabajando en un proyecto de tarea y se supone que debo realizar una consulta de base de datos que encuentra vuelos ya sea por el nombre de la ciudad o el código del aeropuerto, pero la tabla flights
solo contiene los códigos del aeropuerto, por lo que si quiero buscar por ciudad tengo que unirme a la tabla airports
.
La tabla de aeropuertos tiene las siguientes columnas: code, city
La tabla de vuelos tiene las siguientes columnas: airline, flt_no, fairport, tairport, depart, arrive, fare
Las columnas fairport
y tairport
son de y a aeropuerto de códigos.
El las columnas depart
y arrive
son las fechas de salida y llegada.
Se me ocurrió una consulta que primero une los vuelos en la columna fairport
y la columna airports.code
. Para que coincida con el tairport
Tengo que realizar otra unión en los partidos anteriores de la primera unión.
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 = '?')
Mi consulta devuelve los resultados adecuados y será suficiente para el propósito de la tarea, pero me pregunto si puedo JOIN
en múltiples columnas? ¿Cómo construiría la cláusula WHERE
para que coincide con la salida y la ciudad/código de destino?
A continuación hay una "pseudo-consulta" sobre lo que quiero alcanzar, pero no puedo obtener la sintaxis correctamente y no se cómo representar la tabla airports
para las salidas y los destinos:
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')
Actualización
También encontré esta representación visual de las sentencias SQL Join para ser muy útil como una guía general sobre cómo construir sentencias SQL!
5 answers
Puede UNIRSE con la misma tabla más de una vez dando a las tablas unidas un alias , como en el siguiente ejemplo:
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='?'
Tenga en cuenta que el to_port
y from_port
son alias para la primera y segunda copia de la tabla airports
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-02 21:39:10
Algo así....
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-02 21:14:05
Si mysql está bien para usted:
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: se agregó un ejemplo para filtrar la salida por código o ciudad
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-02 21:18:35
¿Puedes usar y en la cláusula on?
Por ejemplo, algo como:
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)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-03 19:32:45
Si desea buscar en los aeropuertos DESDE y HACIA, querrá unirse a la tabla Aeropuertos dos veces, entonces puede usar las tablas desde y hacia en su conjunto de resultados:
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
...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-05 04:47:39