首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索旅行时间表的路线

搜索旅行时间表的路线
EN

Stack Overflow用户
提问于 2018-12-06 23:18:20
回答 1查看 73关注 0票数 1

情况

我们正在实施一个搜索,您可以通过从哪里到您想去的地方搜索时间表。

定义

  1. 如果往返行程很简单,那么所有的站点都会被返回。
  2. 如果与一条腿完全匹配,则只返回该条腿
  3. 如果是不同的腿,这两条腿可能是腿之间的。

DB模式

日程安排

  • ID (主键)
  • 名字

  • ID (主键)
  • Origin_ID (外键)
  • Destination_ID (外键)
  • Schedule_ID (外键进度表)
  • ETD (iso 8601日期字符串)
  • ETA (iso 8601日期字符串)

示例

日程安排:

代码语言:javascript
复制
|---------|--------------|--------------|
|    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   |
|---------|--------------|--------------|
  • 个人1想从机场X机场Y
    • 无结果

  • 第二人想从机场A机场F
    • 返回整个时间表

  • 第三人想从机场B机场C
    • 只带第二条腿的返回时间表

  • 4个人想从机场C机场F
    • 带第三、第四及第五条的返回时间表

  • 5个人想从机场D机场B
    • 无结果

伪码

  1. 查找时间表 选择ScheduleID作为ID,从ScheduleID IN (从ScheduleID从Leg选择Leg.Origin_ID = FROM和ETD > DateAdd(day,-1,getUTCDate())和Leg.Destination_ID = to按ScheduleID,ETD按ETD排序)
  2. 把日程安排好 选择转换(char(20),Leg.ETD AT时区'UTC',127)作为ETD,转换(char(20),Leg.ETA AT时区'UTC',127)作为ETA,Leg.Origin_ID,Leg.Destination_ID,Leg.ScheduleID,Leg.ID,从Schedule.ID = Leg.ScheduleID的内连接计划中选择Schedule.ID= Leg.ScheduleID,Leg.ScheduleID IN () ORDER BY Leg.ScheduleID,Leg.ETD
  3. 过滤器适用腿 变量res = [];在第二个查询上循环group="Schedule_ID“var start = false;var currentSchedule ={ 'id':Schedule_ID,‘双腿’:[] };内循环if (Origin_ID来自){ currentSchedule.legs.push(ID);currentSchedule'etd‘= ETD;start = true;} if (启动){ if (非currentSchedule.legs.includes(ID)) { currentSchedule.legs.push(ID);} if (Destination_ID to) { currentSchedule'eta‘= ETA;} res.push(currentSchedule);

问题

这段代码可以工作,但我对生成的代码有点不满意。我想知道是否有一种方法可以重构代码,以便减少步骤,减少循环,从而使代码更快、更好地调试。

有什么建议吗?

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2018-12-06 23:58:26

第一个查询返回在fromto上完全匹配的腿,您不需要在同一个表上使用内部IN (SELECT...)。只需在Leg上直接过滤:

代码语言:javascript
复制
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

第二个查询看起来没问题。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53661131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档