Да, хотя в зависимости от вашего приложения производительность может быть не такой, как вы ожидаете.
Следуя вашему примеру, назовем остановку A исходной остановкой, а остановки B и C — соединенными остановками. Затем, чтобы построить множество связанных остановок, мы хотим найти все остановки, которые
Поделитесь поездкой с исходной остановкой и
В этой совместной поездке их посещают либо непосредственно до, либо сразу после исходной остановки.
Мы можем использовать поле stop_sequence
таблицы stop_times
для проверки второго условия. Попробуйте этот SQL:
SELECT DISTINCT stops.id, stops.code, stops.name
FROM stop_times AS origin_stop
INNER JOIN stop_times AS connected_stops
ON connected_stops.trip_id = origin_stop.trip_id
AND ABS(connected_stops.stop_sequence - origin_stop.stop_sequence) = 1
INNER JOIN stops
ON stops.id = connected_stops.stop_id
WHERE origin_stop.stop_id = <origin stop ID>;
Это присоединяется к таблице stops
для более красивого вида; если все, что заботит ваше приложение, - это идентификаторы подключенных остановок, вы можете удалить это соединение и изменить первую строку на просто "SELECT DISTINCT connected_stops.stop_id
".
Чтобы сделать производительность приемлемой, вам нужно создать индексы для stop_times.stop_id
и stop_times.trip_id
:
CREATE INDEX stop_times_stop_id_index ON stop_times(stop_id);
CREATE INDEX stop_times_trip_id_index ON stop_times(trip_id);
Но если вы разрабатываете онлайн-приложение, это, вероятно, не лучший вариант. Вам лучше предварительно рассчитать соединения между остановками, используя графическое представление транзитной сети в памяти, а затем запросить это во время выполнения.
person
Community
schedule
16.07.2014