我正在做一个家庭作业项目,我应该执行数据库查询,通过城市名称或机场代码查找航班,但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')
我还发现this visual representation of SQL Join statements 非常有用,作为如何构建SQL语句的一般指南!
答案 0 :(得分:124)
您可以通过为连接的表格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
表的第一个和第二个副本的别名。
答案 1 :(得分:24)
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
答案 2 :(得分:18)
如果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 = '?'
编辑:添加示例以过滤代码或城市的输出
答案 3 :(得分:14)
你能在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)
答案 4 :(得分:3)
如果要在FROM和TO机场上搜索,您需要两次加入机场表 - 然后您可以在结果集中使用from和to from table:
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
...