我需要为火车时刻表创建一个简单的数据库。
我将有一张包含列车所有路线的路线表。路线将类似于
id | departure_station | arrival_station | time
但是,如果departure_station为B
且到达站为G
,我会将C
到F
之间的所有电台放在他们之间,无法总结时间或更别说为用户提供整条路线了。
我的想法是为每个电台提供一个唯一的ID,然后检索ID为&departure_station
且ID为B
的所有G
个结果,按ID
排序,结果将是-C-D-E-F-
,但似乎这不是最简单的方法。
由于SQL数据库没有按顺序排列结果,我如何将B
引用到D
,然后D
引用E
,{{1}到E
直到F
?
编辑:
样品
G
客户希望离开traind_id | departs | arrives | route_id
1337 Iasi Pascani 56
route_id | dep_station | arr_station | time
56 Val. Lupului Letcani 00:05
56 Letcani Tg. Frumos 00:10
56 Tg. Frumos Podu Iloaiei 00:20
56 Podu Iloaiei Motca 00:10
56 Motca Pascani 00:30
并到达Letcani
。为此,我想告诉他,他可以在Motca
路线上乘坐1337号列车
他的电台将Iasi-Pascani
,总Letcani-Tg. Frumos-Podu Iloaiei-Motca
。
但是如何按顺序选择电台?如果两个电台之间没有任何连接,除了它们之间的中间电台,我怎么知道我可以从route time = 00:10 + 00:20 + 00:10 = 00:40 minutes
到达Motca
。
答案 0 :(得分:0)
首先,找出是否有任何匹配的路线,即任何有出发站和到站的路线:
SELECT route_id
FROM RouteStations AS R1
JOIN RouteStations AS R2 USING (route_id)
WHERE R1.dep_station = 'Letcani'
AND R2.arr_station = 'Motca';
然后,对于每个这样的路线,使用递归common table expression来获取电台:
WITH RECURSIVE steps(nr, dep, arr, time) AS (
SELECT 1,
dep_station,
arr_station,
time
FROM RouteStations
WHERE route_id = 56
AND dep_station = 'Letcani'
UNION ALL
-- fetch the step that departs from the previous arrival station
SELECT steps.nr + 1,
RouteStations.dep_station,
RouteStations.arr_station,
RouteStations.time
FROM RouteStations
JOIN steps ON steps.arr_station = RouteStations.dep_station
WHERE route_id = 56
AND RouteStations.dep_station <> 'Motca'
)
SELECT *
FROM steps
ORDER BY nr;