【发布时间】:2017-04-12 08:25:45
【问题描述】:
我有一个像这样建模的简单地铁线路系统:
- 一条线路有多站。
- 每个车站都有时间表。
- 时间表包含一些时间信息和一个方向,该方向指示时间信息用于线路的哪个方向。
我的问题是,给定一个时间表,我如何找到属于那个方向的线路的终点站?
我的表格结构如下:
CREATE TABLE schedule (
id serial PRIMARY KEY,
to_start boolean,
start_time time,
end_time time,
station_id REFERENCES station
);
CREATE TABLE station (
id serial PRIMARY KEY,
name varchar,
order integer,
line_id integer REFERENCES line
);
CREATE TABLE line (
id serial PRIMARY KEY,
name varchar
);
如果schedule.to_start是true,则表示方向指向车站,顺序为1,false到max(order)。
这里是一些示例数据:
时间表
id | to_start | start_time | end_time | station_id
----+----------+------------+----------+------------
1 | f | 06:02:00 | 22:02:00 | 2
2 | t | 06:35:00 | 23:07:00 | 2
站台表
id | name | order | line_id
----+--------------+--------+---------
1 | Station A | 1 | 1
2 | Station B | 2 | 1
3 | Station C | 3 | 1
4 | Station D | 1 | 2
折线表
id | name
----+--------
1 | Line 1
2 | Line 2
因此,如果给定一个schedule.id 值,例如1,我如何找到对应的station.name,它应该是Station C(因为该时间表是id 为2 的车站,属于id 为的线路1,由于to_start是false,所以它指向行尾,应该是Station C)?
我使用 postgresql,我最初的尝试依赖于多次连接到数据库,在这种情况下,我首先根据给定的 id 选择时间表,保存其 to_start 和 station_id,然后使用保存station_id,保存它的line_id,根据to_start的值,我要么选择带有line_id的电台和1的order,要么先找到max(order),然后选择带有@的电台987654352@ 和最大订单。
感觉真的很麻烦,不让postgresql做最好的优化。
有没有办法用一个 sql 做到这一点?
【问题讨论】:
-
请Edit您的问题并添加一些示例数据和基于该数据的预期输出。 Formatted text 请no screen shots。 edit 您的问题不要在 cmets 中发布代码或其他信息。
-
@a_horse_with_no_name 感谢您的建议。已编辑。
-
@hgl 到目前为止你尝试了什么?
-
@JohnHC 我在问题的底部提到了它。我没有发布代码,只是描述了逻辑,因为它涉及将结果保存到变量并进行新的查询,这似乎超出了 sql 的范围。
标签: sql database postgresql