1

我有一个带有 GTFS 数据的 MySQL 数据库设置,我正在尝试查询数据库以返回按到每条路线上最近站点的距离排序的路线列表(无重复)。(注意:坐标会根据用户所在的位置而变化)

数据库相当大(stop_times 表中有数百万行,stop_times 表中有 10,000 行)所以我想让它尽可能高效。

我尝试的一件事是创建一个名为 stop_routes_link 的临时表(在将 GTFS 数据导入我的数据库时创建),它将停靠点与路线链接起来,这样每个停止路线对都有一个条目,如下所示:

route_id  |   stop_id
-----------------------
    25    |  366072709
    21    |  366072709
    21    |  194326291
    F     |  60745282
    Q     |  198000482

然后我运行了这个完美的查询:

SELECT routes.route_short_name AS route_short_name
FROM routes
LEFT JOIN (
    SELECT ( 3959 * acos( cos( radians(39.94868155755109) ) * cos( radians( stops.stop_lat ) ) * cos( radians( stops.stop_lon ) - radians(-75.15972534860013) ) + sin( radians(39.94868155755109) ) * sin( radians( stops.stop_lat ) ) ) ) AS distance, stop_routes_link.route_id AS route_id 
    FROM stops
    LEFT JOIN stop_routes_link ON stops.stop_id = stop_routes_link.stop_id ORDER BY distance)
AS stops ON routes.route_id = stops.route_id
ORDER BY stops.distance

它返回:

route_short_name
----------------
      23
      23
      12
      12
      9
      21
      38

这就是我想要的(我知道那些是距离该位置最近的路线),除了它返回路线的重复项,因为我认为它为路线上的每个站点返回一行。

如何仅返回唯一路线?我认为“LEFT JOIN”只会​​导致路由表中的每个条目只有一行,但事实并非如此。

我也试过:

SELECT DINSTINCT routes.route_short_name AS route_short_name
FROM routes
LEFT JOIN (
    SELECT ( 3959 * acos( cos( radians(39.94868155755109) ) * cos( radians( stops.stop_lat ) ) * cos( radians( stops.stop_lon ) - radians(-75.15972534860013) ) + sin( radians(39.94868155755109) ) * sin( radians( stops.stop_lat ) ) ) ) AS distance, stop_routes_link.route_id AS route_id 
    FROM stops
    LEFT JOIN stop_routes_link ON stops.stop_id = stop_routes_link.stop_id ORDER BY distance)
AS stops ON routes.route_id = stops.route_id
ORDER BY stops.distance

和:

SELECT routes.route_short_name AS route_short_name
FROM routes
LEFT JOIN (
    SELECT ( 3959 * acos( cos( radians(39.94868155755109) ) * cos( radians( stops.stop_lat ) ) * cos( radians( stops.stop_lon ) - radians(-75.15972534860013) ) + sin( radians(39.94868155755109) ) * sin( radians( stops.stop_lat ) ) ) ) AS distance, stop_routes_link.route_id AS route_id 
    FROM stops
    LEFT JOIN stop_routes_link ON stops.stop_id = stop_routes_link.stop_id ORDER BY distance)
AS stops ON routes.route_id = stops.route_id
GROUP BY route_short_name
ORDER BY stops.distance

但是他们都没有返回最近的路线,他们返回了一个随机排序的路线列表(我不确定它是如何计算的),我假设这是因为分组把它弄乱了。

任何帮助将不胜感激!

4

0 回答 0