如何在多列上进行INNER JOIN


168

我正在做一个家庭作业项目,应该执行一个数据库查询,该查询可以按城市名称或机场代码查找航班,但是该flights表仅包含机场代码,因此如果要按城市搜索,我必须参加airports桌子。

机场表有以下几列:code, city
该航班表有以下几列:airline, flt_no, fairport, tairport, depart, arrive, fare
fairporttairport机场代码。
departarrive是出发和到达的日期。

我想出一个查询,该查询首先将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')

更新资料

我也发现了SQL的语句加入这个可视化表示非常的了解如何构建SQL语句的一般指导帮助!


3
提示:您需要为每条记录查找两个城市(一个用于航站楼,另一个用于航站楼。因此(确实需要)有两个 JOIN,并且包含airports表,但是其中一个基于Fairport,另一个在飞机场上
mjv

2
提示2:因此,您还需要为Airports表添加别名,以便您知道如何区分它们(即,哪个机场表带有Fairport查找和Tairport查找)。别名的SQL关键字为AS(尽管可以省略,例如... JOIN airport [AS] FA ON FA.code = flight.tairport ...)
mjv 2010年

Answers:


141

您可以通过为联接的表赋予别名来多次与同一个表联接,如以下示例所示:

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_portfrom_portairports表的第一和第二个副本的别名。


好的,我尝试了上述解决方案,并出现以下错误:SQL语法错误;检查与MySQL服务器版本相对应的手册以获取正确的语法,以在“ INNER_JOIN机场to_port ON(to_port.code = Flights.tairport)WHERE”附近使用第7行
Kiril

2
哦,我知道为什么:)应该是INNER JOIN而不是INNER_JOIN ... DOH!
基里尔

21
如果机场表很大,最好在多个条件下仅将其加入一次。有点像- flights f INNER JOIN airports a ON a.code = f.fairport OR a.code = f.tairport请提出建议。
2013年

26

就像是....

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

1
我在上面已经问过了,我想在这里也会问到它-如果airports表很大(并且使用WHERE条件对整个查询有更多的过滤器),最好在多个条件下仅将其联接一次。像- flights f INNER JOIN airports a ON a.code = f.fairport OR a.code = f.tairport它有什么区别吗?你怎么看?
Ankur-m 2013年

1
它对结果有所不同,前者每次航班从到到都会产生一行,您的建议是每次航班产生两行,从from产生一行,而到机场则产生一行。虽然只加入一次会更快。
Paul Creasey

19

如果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 = '?'

编辑:添加示例以过滤代码或城市的输出


12

您可以只在on子句中使用and吗?

例如,类似:

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
在地球上如何获得14次投票?该语句的语法和含义均不正确。
超crectarian

3

如果要在FROM和TO机场上进行搜索,则需要在Airports表上进行两次连接-然后可以在结果集中使用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
 ...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.