项目目标:
我们正在开发Api用户将搜索公交车的公交车时刻.
以下是我的 table structure
我有以下 tables
公共汽车
id | bus_name
Run Code Online (Sandbox Code Playgroud)
表格说明: 存储所有公交车名称
路线
id | route_name
Run Code Online (Sandbox Code Playgroud)
表格描述: 存储所有城市名称
停止
id | stop_name
Run Code Online (Sandbox Code Playgroud)
表格描述: 所有停止名称
stop_orders
id | route_id | stop_id | stop_order
Run Code Online (Sandbox Code Playgroud)
表格描述:这里我将为city和stop_order列分配句点,帮助识别彼此相邻的站点
bus_timing
id | stop_order_id | bus_id | bus_timing | trip | trip_direction
Run Code Online (Sandbox Code Playgroud)
表格说明:在这里,我将为路线停靠分配公交车以及时间和行程和方向
输出期望:
当用户在时间点之间搜索源到目的地时,Api必须随时间返回所有总线列表
如果没有直达公交车那么应该显示相互连接的公交
例如,如果用户之间寻找stop_8到stop_18与01:00:00到12:00:00那么随着时间的推移应该show.if直达巴士不在那里所有巴士名单两个站之间的旅行,然后相互连接的链路总线列表应该显示
输出我得到的是
现在的返回结果问题是
它将返回所有公共汽车,即使公共汽车只是前往stop_8但不是stop_18.但我的结果必须只返回那些将在两站之间行驶的公共汽车,我的意思是它必须落在两站之间.
即使我不知道如何找到互连的公交车名单
当时间范围很长时,可能会有相同的公共汽车多次行驶(行程和方向)
更新 仍在寻找答案.现在给出答案有一些点,所以提供赏金
Gor*_*off 20
因为stop_id不能在同一行中有两个不同的值.
聚合是实现您想要的一种方式:
SELECT b.bus_name
FROM buses b JOIN
route_connect rc
ON rc.busid = b.id JOIN
stops s
ON s.id = rc.stop_id
GROUP BY b.bus_name
HAVING SUM( s.stop_name = 'Sydney' ) > 0 AND
SUM( s.stop_name = 'Melbourne' ) > 0;
Run Code Online (Sandbox Code Playgroud)
这将返回具有两个城市名称的停靠点的公交车.
鉴于公交车可以有很多停靠点,它可能更有效:
SELECT b.bus_name
FROM buses b JOIN
route_connect rc
ON rc.busid = b.id JOIN
stops s
ON s.id = rc.stop_id
WHERE s.stop_name in ('Sydney', 'Melbourne')
GROUP BY b.bus_name
HAVING COUNT(DISTINCT s.stop_name) = 2;
Run Code Online (Sandbox Code Playgroud)