代码之家  ›  专栏  ›  技术社区  ›  shaedrich Gabin traverse

搜索行程表的路线

  •  1
  • shaedrich Gabin traverse  · 技术社区  · 6 年前

    处境

    我们正在实施一个搜索,您可以通过从何处到您想去的地方来搜索日程安排。

    定义

    1. 如果从和到马赫计划从和到它很容易和所有停止返回
    2. 如果from和to位于不同的腿上,则返回这两个腿,也可能返回中间的腿

    数据库模式

    日程
    • ID(主键)
    • 原点ID(外键)
    • 目的地标识(外键)
    • 计划ID(计划表的外键)
    • ETD(iso 8601日期字符串)
    • ETA(iso 8601日期字符串)

    例子

    |---------|--------------|--------------|
    |    ID   |    Origin    | Destination  |
    |---------|--------------|--------------|
    |    1    |  Airport A   |  Airport B   |
    |---------|--------------|--------------|
    |    2    |  Airport B   |  Airport C   |
    |---------|--------------|--------------|
    |    3    |  Airport C   |  Airport D   |
    |---------|--------------|--------------|
    |    4    |  Airport D   |  Airport E   |
    |---------|--------------|--------------|
    |    5    |  Airport E   |  Airport F   |
    |---------|--------------|--------------|
    
    • X机场
      • 没有结果
    • 机场A
      • 返回整个时间表
    • 第三个人想从 B机场 C机场
      • 第3、4和5航段的返回时间表
    • D机场 B机场
      • 没有结果

    伪码

    1. SELECT
          ScheduleID AS ID
      FROM
          Leg
      WHERE
          ScheduleID IN (
              SELECT
                  ScheduleID
              FROM
                 Leg
              WHERE
                  Leg.Origin_ID = from AND
                  ETD > DateAdd(day, -1, getUTCDate())
          ) AND
          Leg.Destination_ID = to
      GROUP BY
          ScheduleID, ETD
      ORDER BY
          ETD
      
    2. 获得时间表的支持

      SELECT
          convert(char(20), Leg.ETD AT TIME ZONE 'UTC', 127) AS ETD,
          convert(char(20), Leg.ETA AT TIME ZONE 'UTC', 127) AS ETA,
          Leg.Origin_ID, Leg.Destination_ID, Leg.ScheduleID, Leg.ID
      FROM
          Leg
      INNER JOIN
          Schedule ON Schedule.ID = Leg.ScheduleID
      WHERE
          Leg.ScheduleID IN (<!-- IDs from query above -->)
      ORDER BY
          Leg.ScheduleID, Leg.ETD
      
    3. 过滤适用支腿

      var res = [];
      loop over 2nd query group="Schedule_ID"
          var start = false;
          var end = false;
          var currentSchedule = {
              'id': Schedule_ID,
              'legs': []
          };
          inner loop
              if (Origin_ID is from) {
                  currentSchedule.legs.push(ID);
                  currentSchedule['etd'] = ETD;
                  start = true;
              }
      
              if (start) {
                  if (not currentSchedule.legs.includes(ID)) {
                      currentSchedule.legs.push(ID);
                  }
                  if (Destination_ID is to) {
                     currentSchedule['eta'] = ETA;
                  }
              }
      res.push(currentSchedule);
      

    问题

    有什么建议吗?

    提前谢谢!

    1 回复  |  直到 6 年前
        1
  •  0
  •   GMB    6 年前

    from to IN (SELECT...) Leg 直接:

    SELECT
        ScheduleID AS ID
    FROM
        Leg
    WHERE
        Origin_ID = from
        AND ETD > DateAdd(day, -1, getUTCDate())
        AND Destination_ID = to
    GROUP BY
        ScheduleID, ETD
    ORDER BY
        ETD
    

    代码的第三部分对我来说没有意义。