Mysql如何连接这些表

Mysql如何连接这些表,mysql,Mysql,我有以下表格和样本数据 SCHEDULE TABLE fightno day_of_week orgin dest depart_time arrive_time totalfare AQ2131 WED BLR KTA 04:30 11:00 6000 FLIGHT_STOPS (if it have stops) flightno day_of_week airport_code a

我有以下表格和样本数据

SCHEDULE TABLE
fightno   day_of_week  orgin    dest  depart_time   arrive_time     totalfare
AQ2131    WED          BLR      KTA   04:30         11:00           6000

FLIGHT_STOPS (if it have stops)
flightno  day_of_week  airport_code   arrival_time  departure_time  stopmilesfare
AQ2131    WED          BOM            02:17         05:40           3000 
AQ2131    WED          COH            03:17         06:40           3000 
AQ2131    WED          GOY            04:17         08:40           3000
航线为BLR->BOM->COH->GOY->KTA


如何连接这些表,以便在用户输入其中任何一个作为源和目标时检索flightno。例如,如果用户输入BLR作为源,COH作为目的地,或COH作为源,GOY作为目的地,我们可以找到航班号。

这是TSQL,使用CTE和ROW_编号代替缺少的航班号。我现在没有时间把它翻译成MySQL,但是如果LegNo已经在那里,那就很容易了

同样是ISNULLx,y不是MySQL,但应该转换为当x为NULL时的大小写,然后是y,否则x结束

CREATE TABLE Schedule (FlightNo CHAR(6), Week_Day CHAR(3), Origin CHAR(3), Dest CHAR(3), Time_Depart Time, Time_Arrive Time)
CREATE TABLE Flight_Stop (FlightNo CHAR(6), Week_Day CHAR(3), Airport CHAR(3), Time_Arrive Time, Time_Depart Time)

INSERT INTO Schedule VALUES 
 ('AQ2131','WED','BLR','KTA','01:30','11:00')
,('AB1234','TUE','AAA','BBB','01:00','02:00')
INSERT INTO Flight_Stop VALUES 
 ('AQ2131','WED','BOM','02:17','05:40')
,('AQ2131','WED','COH','03:17','06:40')
,('AQ2131','WED','GOY','04:17','08:40')

WITH cte AS (
  SELECT *
        ,ROW_NUMBER() OVER (PARTITION BY FlightNo, Week_Day ORDER BY Time_Arrive) LegNo 
    FROM Flight_Stop
)
SELECT s.FlightNo
      ,s.Week_Day
      ,s.Origin
      ,ISNULL(f.Airport,s.Dest) Dest
      ,0 LegNo
  FROM Schedule s
       LEFT JOIN
       cte f ON s.FlightNo = f.FlightNo
            AND s.Week_Day = f.Week_Day
 WHERE ISNULL(f.LegNo,1) = 1
UNION 
SELECT s.FlightNo
      ,s.Week_Day
      ,s.Origin
      ,ISNULL(f.Airport,s.Dest) Dest
      ,f.LegNo
  FROM Schedule s
       LEFT JOIN
       cte f ON s.FlightNo = f.FlightNo
            AND s.Week_Day = f.Week_Day
 WHERE f.LegNo = (SELECT MAX(LegNo)
                    FROM cte a 
                   WHERE a.FlightNo = f.FlightNo
                     AND a.Week_Day = f.Week_Day)
UNION
SELECT a.FlightNo
      ,a.Week_Day
      ,a.Airport
      ,b.Airport
      ,a.LegNo
  FROM cte a
       INNER JOIN
       cte b ON a.FlightNo = b.FlightNo
            AND a.Week_Day = b.Week_Day
            AND a.LegNo + 1 = b.LegNo

首先,让我们退一步。航班计划为从A到D的一个方向,或D到A的两个不同航班号。你必须有正确的方向相关性才能获得正确的飞行。对于露齿而笑,想象中的国际

Flight #123 From Country A -> B -> C -> D.
Flight #987 From Country D -> C -> B -> A.
两次旅行都有国家“C”和“B”。。。但是,如果我们的旅行从C开始,在B结束,你需要987航班,因为你需要在C登机,然后在B停留——在那个方向。123次航班将失败,因为您将在“A”在“B”下车,然后到达“C”站接机。我将使用“CCC”和“BBB”只是为了在查询时遵守3个字符的机场代码

第一个查询将是联合的一部分,它将获取从给定位置开始的所有航班。。。行程的目的地或其中一个航段是所需“BBB”位置的目的地。通过在同一航班和目的地机场代码上使用left/join,如果它不为NULL,则有一条航段到达该目的地

SELECT 
      s1.flightNo
   from 
      schedule s1
         LEFT JOIN flight_stops fs1
            ON s1.flightNo = fs1.flightNo
            AND fs1.airport_code = 'BBB'
   where 
          s1.origin = 'CCC'
      AND (    s1.dest = 'BBB'
           OR fs1.flightNo IS NOT NULL )
下一个查询UNION ALL one将获得从其他地方开始的任何航班,并且该航班的一个航段作为旅程“CCC”的起始航班。然后,它将连接到时间表表,以查看航班的目的地是否为所讨论的“BBB”。如果不是这样,则再次查看航班停靠表,但特别是对于到达时间在“CCC”开始航班时间之后的“BBB”

SELECT 
      fs1.flightNo
   from 
      flight_stops fs1
         LEFT JOIN schedule s2
             ON fs1.flightNo = s2.flightNo
            AND s2.dest = 'BBB'

         LEFT JOIN flight_stops fs2
             ON fs1.flightNo = fs2.flightNo
            AND fs1.arrival_time < fs2.arrival_time
            AND fs2.airport_code = 'BBB'
   where 
      fs1.airport_code = 'CCC'
与航班头信息

SELECT
      s.*
   from
      ( (first select above)
         UNION ALL
         (second select above) ) QualFlights
      JOIN Schedule s
         ON QualFlights.flightNo = s.flightNo
现在,所有这些都表明,如果您的flight_stops表包含始发地和目的地位置,这将更加容易。然后,整个查询可以简化为,在航班停靠点上有一个索引。。。机场代码、航班号、到达时间

  SELECT 
          fs1.flightNo
       from 
          flight_stops fs1
             LEFT JOIN flight_stops fs2
                 ON fs1.flightNo = fs2.flightNo
                AND fs1.arrival_time < fs2.arrival_time
                AND fs2.airport_code = 'BBB'
       where 
          fs1.airport_code = 'CCC'

是的。。。基本上您只需要在航班表的分支中同时包含起始和目的地的查询。

您说需要一种更好的方式来连接这些表,但没有显示当前的连接尝试。比什么好?对不起,我的意思是我不知道如何加入这些表。你想要一个结果集,其中包含每个分支的起点和终点?例如:AQ2131 WED BLR BOM 4:30 02:17是的,这就是我需要的!!初始和最终航段不在表FLIGHT_STOP中,而是由表Schedule中的条目暗示?
  SELECT 
          fs1.flightNo
       from 
          flight_stops fs1
             LEFT JOIN flight_stops fs2
                 ON fs1.flightNo = fs2.flightNo
                AND fs1.arrival_time < fs2.arrival_time
                AND fs2.airport_code = 'BBB'
       where 
          fs1.airport_code = 'CCC'