Mysql :00之后的巴士将在07:43:00到达。我不想要07:20:00之前的停车时间(例如,当公共汽车在07:00:00到达时),我也不想要前两辆公共汽车之后的时间(即使路线的第三辆公共汽车在08:03:00到达,我想忽略它,因为我只想要路线的前两辆公共汽车时

Mysql :00之后的巴士将在07:43:00到达。我不想要07:20:00之前的停车时间(例如,当公共汽车在07:00:00到达时),我也不想要前两辆公共汽车之后的时间(即使路线的第三辆公共汽车在08:03:00到达,我想忽略它,因为我只想要路线的前两辆公共汽车时,mysql,sql,gtfs,Mysql,Sql,Gtfs,:00之后的巴士将在07:43:00到达。我不想要07:20:00之前的停车时间(例如,当公共汽车在07:00:00到达时),我也不想要前两辆公共汽车之后的时间(即使路线的第三辆公共汽车在08:03:00到达,我想忽略它,因为我只想要路线的前两辆公共汽车时间)。@user3614030我为它模拟了一些示例数据,并基于它提出了一个解决方案。请参阅更新的答案。它包含一个指向SQL FIDLE的链接。@user3614030很好。但我只是注意到它需要一个小补丁。必须通过子查询的方式将route_id添


:00之后的巴士将在07:43:00到达。我不想要07:20:00之前的停车时间(例如,当公共汽车在07:00:00到达时),我也不想要前两辆公共汽车之后的时间(即使路线的第三辆公共汽车在08:03:00到达,我想忽略它,因为我只想要路线的前两辆公共汽车时间)。@user3614030我为它模拟了一些示例数据,并基于它提出了一个解决方案。请参阅更新的答案。它包含一个指向SQL FIDLE的链接。@user3614030很好。但我只是注意到它需要一个小补丁。必须通过子查询的方式将route_id添加到订单中。这是为了确保
@prev_routeid
变量的逻辑正确完成。谢谢。这看起来确实更容易阅读。你知道我怎么会在下一站只返回2次吗?据我所知,这个答案与我之前的答案相同(但更容易理解)@user3614030那么你能在你的问题中添加一些基于样本数据的预期结果吗?这可以避免误解您所说的“下两站”是什么意思对不起,给您带来了混乱。我添加了“示例数据”。我的意思是,接下来的两次,每辆公共汽车都会经过车站。例如,如果是07:20:00(上午7:20),对于路线2,下一辆公交车将在07:23:00到达,之后的公交车将在07:43:00到达。我不想要07:20:00之前的停车时间(例如,当公共汽车在07:00:00到达时),我也不想要前两辆公共汽车之后的时间(即使路线的第三辆公共汽车在08:03:00到达,我想忽略它,因为我只想要路线的前两辆公共汽车时间)。@user3614030我为它模拟了一些示例数据,并基于它提出了一个解决方案。请参阅更新的答案。它包含一个指向SQL FIDLE的链接。@user3614030很好。但我只是注意到它需要一个小补丁。必须通过子查询的方式将route_id添加到订单中。这是为了确保带有
@prev_routeid
变量的逻辑正确执行。
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
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
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;