Mysql GTFSSQL查找最近的路由
我有一个带有GTFS数据的MySQL数据库,我正在尝试查询数据库,以返回一个路由列表,每个路由上没有重复的路由,按距离最近的站点的距离排序。注意:坐标将根据用户所在的位置而变化 数据库相当大,stop_times表中有数百万行,stops表中有10000行,因此我希望尽可能提高效率 我尝试过的一件事是创建一个名为stop_routes_link的临时表,该表是在GTFS数据导入我的数据库时创建的,该表使用路由链接站点,这样每个站点路由对都有一个条目,如下所示:Mysql GTFSSQL查找最近的路由,mysql,gtfs,Mysql,Gtfs,我有一个带有GTFS数据的MySQL数据库,我正在尝试查询数据库,以返回一个路由列表,每个路由上没有重复的路由,按距离最近的站点的距离排序。注意:坐标将根据用户所在的位置而变化 数据库相当大,stop_times表中有数百万行,stops表中有10000行,因此我希望尽可能提高效率 我尝试过的一件事是创建一个名为stop_routes_link的临时表,该表是在GTFS数据导入我的数据库时创建的,该表使用路由链接站点,这样每个站点路由对都有一个条目,如下所示: route_id | sto
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
这就是我想要的,我知道这些是离那个位置最近的路线,除了它为路线返回重复的路线,因为我认为它为路线上的每个站点返回一行
如何仅返回唯一的路线?我认为左连接只会导致routes表中的每个条目有一行,但事实并非如此
我也试过:
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
以及:
但是它们都不返回最近的路线,而是返回一个随机排列的路线列表,我不确定它是如何计算的,我假设这是因为分组搞砸了
任何帮助都将不胜感激 我猜是因为分组搞砸了。什么分组?@草莓通过分组,我的意思是它会将任意距离附加到路线上,因为它将所有相同的路线分组在一起,取我认为的第一个距离值,然后按距离的顺序排列列表,但结果是错误的,因为附加到路线上的站点不是路线上最近的站点。这有意义吗?分组来自GROUP BY语句但只有最后一个查询有一个Thosey,该语句仅引用最后两个查询。指的是集团成员和不同的声明
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