如何使用 GTFS 列出从一站到另一站的所有行程?
How can I list all the trips from one stop to another using GTFS?
我正在使用以下 table:
1 0051ML66220600132482 06:00:00 06:00:00 1538 100 0 1
2 0051ML66220600132482 06:00:00 06:00:00 1540 200 0 0
3 0051ML66220600132482 06:00:00 06:00:00 1541 300 0 0
4 0051ML66220600132482 06:01:00 06:01:00 1542 400 0 0
5 0051ML66220600132482 06:01:00 06:01:00 1543 500 0 0
6 0051ML66220600132482 06:02:00 06:02:00 1544 600 0 0
7 0051ML66220600132482 06:03:00 06:03:00 1546 700 0 0
Table 结构如下:
> ------------------------------------------------------------------
> -- TABLE stop_times
> ------------------------------------------------------------------
>
> CREATE TABLE stop_times ( id int(12),
> trip_id varchar(100),
> arrival_time varchar(8),
> arrival_time_seconds int(100),
> departure_time varchar(8),
> departure_time_seconds int(100),
> stop_id varchar(100),
> stop_sequence varchar(100),
> pickup_type varchar(2),
> drop_off_type varchar(2) );
我正在尝试获取 DISTINCT trip_id
是否匹配目的地和到达点 stop_id
我尝试了以下 SQL 但没有成功:
select DISTINCT trip_id from stop_times where stop_id=1538 AND stop_id =1540;
应该在哪里生产:0051ML66220600132482
我也试过 INNER JOIN SQL 如下所示:
SELECT
t.trip_id,
start_s.stop_name as departure_stop,
end_s.stop_name as arrival_stop
FROM
trips t
INNER JOIN stop_times start_st ON t.trip_id = start_st.trip_id
INNER JOIN stops start_s ON start_st.stop_id = start_s.stop_id
INNER JOIN stop_times end_st ON t.trip_id = end_st.trip_id
INNER JOIN stops end_s ON end_st.stop_id = end_s.stop_id
WHERE
start_s.stop_id = 1538
AND end_s.stop_id = 1540;
但是它太慢了,这个简单的查询大约需要 8-15 秒。
解释添加:
进行此查询的 fastest/Best 方法是什么?
这似乎是您需要的查询。我把DISTINCT
拿出来换成GROUP BY
,把WHERE
换成IN
。您的查询表明 stop_id
应该是 INT
类型,而不是 varchar
,因为您没有给它添加引号,fiddle 反映了这一点。
IN
基本上是 OR
而不是 AND
。 AND
不会返回任何内容,因为 stop_id
不在同一行。
SELECT trip_id
FROM stop_times
WHERE stop_id IN(1538,1540)
GROUP BY trip_id
这是一个SQLFiddle
换句话说,您正在寻找一个查询,该查询将识别经过一对停靠点、起点(起点)和终点(终点)的所有行程。
试试这个查询:
SELECT destination.trip_id
FROM stop_times AS origin
INNER JOIN stop_times AS destination
ON destination.trip_id = origin.trip_id
AND destination.stop_id = 1540
WHERE origin.stop_id = 1538
AND origin.stop_sequence < destination.stop_sequence;
或者,为了更漂亮的视图(并匹配您问题中的第二个查询):
SELECT destination.trip_id, origin_stop.name, destination_stop.name
FROM stop_times AS origin
INNER JOIN stop_times AS destination
ON destination.trip_id = origin.trip_id
AND destination.stop_id = 1540
INNER JOIN stops AS origin_stop
ON origin_stop.id = origin.stop_id
INNER JOIN stops AS destination_stop
ON destination_stop.id = destination.stop_id
WHERE origin.stop_id = 1538
AND origin.stop_sequence < destination.stop_sequence;
为了获得良好的性能,请先在 stop_id
和 trip_id
上创建索引:
CREATE INDEX stop_times_stop_id_trip_id_index ON stop_times(stop_id, trip_id);
(请注意,EternalHour 的查询会识别所有经过 或者 停止的行程,而不仅仅是先经过一个然后另一个的行程。)
我正在使用以下 table:
1 0051ML66220600132482 06:00:00 06:00:00 1538 100 0 1
2 0051ML66220600132482 06:00:00 06:00:00 1540 200 0 0
3 0051ML66220600132482 06:00:00 06:00:00 1541 300 0 0
4 0051ML66220600132482 06:01:00 06:01:00 1542 400 0 0
5 0051ML66220600132482 06:01:00 06:01:00 1543 500 0 0
6 0051ML66220600132482 06:02:00 06:02:00 1544 600 0 0
7 0051ML66220600132482 06:03:00 06:03:00 1546 700 0 0
Table 结构如下:
> ------------------------------------------------------------------
> -- TABLE stop_times
> ------------------------------------------------------------------
>
> CREATE TABLE stop_times ( id int(12),
> trip_id varchar(100),
> arrival_time varchar(8),
> arrival_time_seconds int(100),
> departure_time varchar(8),
> departure_time_seconds int(100),
> stop_id varchar(100),
> stop_sequence varchar(100),
> pickup_type varchar(2),
> drop_off_type varchar(2) );
我正在尝试获取 DISTINCT trip_id
是否匹配目的地和到达点 stop_id
我尝试了以下 SQL 但没有成功:
select DISTINCT trip_id from stop_times where stop_id=1538 AND stop_id =1540;
应该在哪里生产:0051ML66220600132482
我也试过 INNER JOIN SQL 如下所示:
SELECT
t.trip_id,
start_s.stop_name as departure_stop,
end_s.stop_name as arrival_stop
FROM
trips t
INNER JOIN stop_times start_st ON t.trip_id = start_st.trip_id
INNER JOIN stops start_s ON start_st.stop_id = start_s.stop_id
INNER JOIN stop_times end_st ON t.trip_id = end_st.trip_id
INNER JOIN stops end_s ON end_st.stop_id = end_s.stop_id
WHERE
start_s.stop_id = 1538
AND end_s.stop_id = 1540;
但是它太慢了,这个简单的查询大约需要 8-15 秒。
解释添加:
进行此查询的 fastest/Best 方法是什么?
这似乎是您需要的查询。我把DISTINCT
拿出来换成GROUP BY
,把WHERE
换成IN
。您的查询表明 stop_id
应该是 INT
类型,而不是 varchar
,因为您没有给它添加引号,fiddle 反映了这一点。
IN
基本上是 OR
而不是 AND
。 AND
不会返回任何内容,因为 stop_id
不在同一行。
SELECT trip_id
FROM stop_times
WHERE stop_id IN(1538,1540)
GROUP BY trip_id
这是一个SQLFiddle
换句话说,您正在寻找一个查询,该查询将识别经过一对停靠点、起点(起点)和终点(终点)的所有行程。
试试这个查询:
SELECT destination.trip_id
FROM stop_times AS origin
INNER JOIN stop_times AS destination
ON destination.trip_id = origin.trip_id
AND destination.stop_id = 1540
WHERE origin.stop_id = 1538
AND origin.stop_sequence < destination.stop_sequence;
或者,为了更漂亮的视图(并匹配您问题中的第二个查询):
SELECT destination.trip_id, origin_stop.name, destination_stop.name
FROM stop_times AS origin
INNER JOIN stop_times AS destination
ON destination.trip_id = origin.trip_id
AND destination.stop_id = 1540
INNER JOIN stops AS origin_stop
ON origin_stop.id = origin.stop_id
INNER JOIN stops AS destination_stop
ON destination_stop.id = destination.stop_id
WHERE origin.stop_id = 1538
AND origin.stop_sequence < destination.stop_sequence;
为了获得良好的性能,请先在 stop_id
和 trip_id
上创建索引:
CREATE INDEX stop_times_stop_id_trip_id_index ON stop_times(stop_id, trip_id);
(请注意,EternalHour 的查询会识别所有经过 或者 停止的行程,而不仅仅是先经过一个然后另一个的行程。)