我的目标很简单。在我的应用程序中,用户将按一个停靠点,它将打开一个屏幕,显示该停靠点正在行驶的每条路线(公交车),并显示该停靠点的每条路线的下2个停靠时间。我想在用户按下停止ID为1571的停止时显示的示例:

公交569路站

2号线
23分钟(7:23 AM)
43分钟(7:43 AM)

37路
15分钟(7:15 AM)
45分钟(7:45 AM)

返回的示例数据(我想要的):
st。出发时间,rte.route_long_name,tr.trip_headsign
市区2号线07:23:00
市区2号线07:43:00
07:15:00,市区37号公路
07:45:00,市区37号公路

应当注意,停止代码为569,停止ID为1571。根据GTFS文档,用户通常会搜索停止代码(569),但在内部将搜索停止ID(1571)。这些来自GTFS软件包中的stops.txt文件。

该示例显示2条路线(2和37),但可能会有更多路线,可能只有1条路线,或者在不久的将来根本没有路线经过此停靠点(我想忽略的时间超过24小时之内)。

免责声明:我对SQL不太满意。我能够创建一个查询来检索相关数据,但是,它返回的数据比每条路线的下两个停止时间要多。我正在应用程序中对其进行解析以获取所需的结果,但是我觉得改善查询条件会容易得多。

SELECT stop_times.departure_time, routes.route_long_name, trips.trip_headsign, calendar.monday, calendar.tuesday, calendar.wednesday, calendar.thursday, calendar.friday, calendar.saturday, calendar.sunday
FROM stop_times, trips, routes, calendar
WHERE stop_times.stop_id = '1571' AND stop_times.trip_id = trips.trip_id AND trips.route_id = routes.route_id AND trips.service_id = calendar.service_id AND 20180801 >= calendar.start_date AND 20180801 <= calendar.end_date
ORDER BY routes.route_short_name, trips.service_id, stop_times.departure_time


以下是相关表格。我将数据完全按照GTFS文档中的指定存储在数据库中。

stops.txt示例行:mysql - 我如何获得每辆经过停靠站的公共(public)汽车的下2个停靠站时间(GTFS数据)?-LMLPHP

routes.txt示例行:mysql - 我如何获得每辆经过停靠站的公共(public)汽车的下2个停靠站时间(GTFS数据)?-LMLPHP

trips.txt示例行:
mysql - 我如何获得每辆经过停靠站的公共(public)汽车的下2个停靠站时间(GTFS数据)?-LMLPHP

stop_times.txt示例行:
mysql - 我如何获得每辆经过停靠站的公共(public)汽车的下2个停靠站时间(GTFS数据)?-LMLPHP

calendar.txt示例行:
mysql - 我如何获得每辆经过停靠站的公共(public)汽车的下2个停靠站时间(GTFS数据)?-LMLPHP

非常感谢您的帮助。

最佳答案

您已经可以做的一件事就是使用标准的JOIN表示法。

它更具可读性,并且不易引起意外的笛卡尔联接。

使用简短的别名可以使SQL更简洁。

SET @StopId = '1571';
SET @CalDate = cast('2018-08-01' as date);

SELECT
 st.departure_time,
 rte.route_long_name,
 tr.trip_headsign,
 cal.monday, cal.tuesday, cal.wednesday, cal.thursday, cal.friday,
 cal.saturday, cal.sunday
FROM stop_times AS st
JOIN trips AS tr ON tr.trip_id = st.trip_id
JOIN routes AS rte ON rte.route_id = tr.route_id
JOIN calendar AS cal ON cal.service_id = tr.service_id
WHERE st.stop_id = @StopId
AND @CalDate between cal.start_date and cal.end_date
ORDER BY rte.route_short_name, tr.service_id, st.departure_time


至于要求每条路线下2个停靠站?

这是一个示例SQL。
其中包括工作日的支票。不知道是否需要这样做,所以仅作演示。

可以找到一个SQL Fiddle here

SET @StopId = 1571;
SET @CalDate = cast('2018-08-01' as date);
SET @StartTime = cast('08:00:00' as time);

SELECT departure_time, route_long_name, trip_headsign
FROM
(
    SELECT
     st.departure_time,
     tr.service_id,
     rte.route_short_name,
     rte.route_long_name,
     tr.trip_headsign,
     @num := if(@prev_routeid = tr.route_id, @num + 1, 1) as RN,
     @prev_routeid := tr.route_id as route_id
    FROM stop_times AS st
    JOIN trips AS tr ON tr.trip_id = st.trip_id
    JOIN routes AS rte ON rte.route_id = tr.route_id
    JOIN calendar AS cal ON cal.service_id = tr.service_id
    -- LEFT JOIN stops AS s on s.stop_id = st.stop_id
    CROSS JOIN (SELECT @num := 0, @type := '') AS vars
    WHERE st.stop_id = @StopId
    AND @CalDate between cal.start_date and cal.end_date
    AND (CASE WEEKDAY(@CalDate)
        WHEN 0 THEN monday
        WHEN 1 THEN tuesday
        WHEN 2 THEN wednesday
        WHEN 3 THEN thursday
        WHEN 4 THEN friday
        WHEN 5 THEN saturday
        WHEN 6 THEN sunday
        END) = 1
    AND st.departure_time >= @StartTime
    ORDER BY tr.route_id, st.departure_time
) Q
WHERE RN <= 2
ORDER BY route_short_name, service_id, departure_time;

关于mysql - 我如何获得每辆经过停靠站的公共(public)汽车的下2个停靠站时间(GTFS数据)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51455750/

10-15 18:56