我试图使用2个相同的INNER JOIN函数,但我无法让它工作

时间:2014-12-09 14:09:40

标签: mysql

此SQL代码用于检索仅在一个区域内飞行的航班,即AK

表机场包含AirportID,AirportDetail

表格航班包含FlightNum,TakeOff,ArriveID

SELECT DISTINCT FlightNum, TakeOffID, ArriveID
FROM flights
INNER JOIN airports
 ON AirportID = ArriveID AND AirportID = TakeOffID
WHERE AirportDetail LIKE '%AK%'

2 个答案:

答案 0 :(得分:1)

也许你只需要两次加入机场......

SELECT DISTINCT F.FlightNum, F.OriginAirportID, F.DestAirportID, Dest.*, Orig.*
FROM flight F
INNER JOIN airport Dest
 ON Dest.AirportID = F.DestAirportID 
INNER JOIN airport Orig
 ON orig.AirportID = F.OriginAirportID
WHERE (Dest.AirportDescription LIKE BINARY '%AK%' 
    AND Orig.AirportDescription LIKEBINARY '%AK%')

根据评论:OP要求所有航班起飞并在阿拉斯加设有目的地。

鉴于这种理解,我相信所需要的是一个AND而不是一个或在where子句中,我相信我在F.Airport中错误,正如评论中所指出的那样。这两项调整都已得到纠正。现在,由于在AirportDescription中跟踪了“STATE”,因此将返回原点和目的地中包含AK的任何内容。

答案 1 :(得分:0)

xQbert的答案很接近,但你可能不清楚为什么。这是一种没有连接的方法,可以帮助您更好地理解如何思考问题:

SELECT * FROM flight
WHERE DestAirportID IN (
    SELECT AirportID FROM airport WHERE AirportDescription LIKE '%AK%'
) AND OrigAirportID IN (
    SELECT AirportID FROM airport WHERE AirportDescription LIKE '%AK%'
);

但要记住的一件事是,MySql(通常)不区分大小写。这意味着如果字符串'ak'在Description字段中出现 where ,它将匹配WHERE子句。虽然'ak'并不常见,但这可能会带来重大问题(DE,AR,CA,OR等),在机场表中有一个专用的“州”栏目会更好。所以更好的查询是:

SELECT *
FROM flight
INNER JOIN airport Orig 
 ON flight.OriginAirportID = Orig.AirportID
INNER JOIN airport Dest
 ON flight.DestAirportID = Dest.AirportID 
WHERE Orig.AirportState = 'AK' 
AND Dest.AirportState = 'AK'