Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql GTFSSQL查找最近的路由_Mysql_Gtfs - Fatal编程技术网

Mysql GTFSSQL查找最近的路由

Mysql GTFSSQL查找最近的路由,mysql,gtfs,Mysql,Gtfs,我有一个带有GTFS数据的MySQL数据库,我正在尝试查询数据库,以返回一个路由列表,每个路由上没有重复的路由,按距离最近的站点的距离排序。注意:坐标将根据用户所在的位置而变化 数据库相当大,stop_times表中有数百万行,stops表中有10000行,因此我希望尽可能提高效率 我尝试过的一件事是创建一个名为stop_routes_link的临时表,该表是在GTFS数据导入我的数据库时创建的,该表使用路由链接站点,这样每个站点路由对都有一个条目,如下所示: route_id | sto

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

数据库相当大,stop_times表中有数百万行,stops表中有10000行,因此我希望尽可能提高效率

我尝试过的一件事是创建一个名为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
这就是我想要的,我知道这些是离那个位置最近的路线,除了它为路线返回重复的路线,因为我认为它为路线上的每个站点返回一行

如何仅返回唯一的路线?我认为左连接只会导致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