繁体   English   中英

我正在尝试使用相同的INNER JOIN函数中的2个,但是我无法使其正常工作

[英]I am trying to use 2 of the same INNER JOIN function but i cant get it to work

我使用此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%'

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

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子句中的or,并且我认为我在F.Airport上的评论中有误。 所有这些调整都已得到纠正。 现在,由于在AirportDescription中跟踪了“ STATE”,因此将返回在始发地和目的地中都包含AK的所有内容。

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”出现在“说明”字段中的任何位置 ,则它将匹配WHERE子句。 尽管'ak'不太常见,但在机场表中有专门的'state'列会更好地解决此问题(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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM