【问题标题】:Mysql Recursive Query / Spherical Law of CosinesMysql递归查询/余弦球定律
【发布时间】:2011-06-01 23:07:44
【问题描述】:

我想从坐标(lat/lng)搜索最近的位置到 mysql 数据库中,我使用球面余弦定律来搜索这些地方:

SELECT onlycoord.id, locations.name, locations.ascii,
    locations.latitude, locations.longitude,
    locations.country, locations.elevation,
    locations.gtopo30, locations.timezone,
    (6371 * ACOS(
        COS( RADIANS( 48.48 ) ) *
        COS( RADIANS( onlycoord.latitude ) ) *
        COS(
            RADIANS( onlycoord.longitude ) -
            RADIANS( 2.20 )
        ) +
        SIN( RADIANS( 48.48 ) ) *
        SIN( RADIANS( onlycoord.latitude ) )
    )) AS distance
FROM onlycoord USE INDEX (coordinate)
    LEFT JOIN locations USE INDEX (id)
    ON (onlycoord.id = locations.id)
WHERE onlycoord.latitude BETWEEN (
    48.48 - ( 5 / 111 )
) AND (
    48.48 + ( 5 / 111 )
) AND onlycoord.longitude BETWEEN (
    2.20 - ( 5 / ABS( COS(
        RADIANS( 48.48 )
    ) * 111 ) )
) AND (
    2.20 + ( 5 / ABS( COS(
        RADIANS( 48.48 ) 
    ) * 111 ) )
)
ORDER BY distance ASC
LIMIT 0, 20

其中6371为地球半径(km),111(km)为纬度1°,cos(纬度)*111(km)为经度1°,5(km)为搜索半径。

问题:我希望找到至少 8 个城市,但 5 公里半径对于压缩区域(许多城市)来说很小但速度很快,所以如果我使用 search radius 对于压缩区域太大,查询会很慢(很多结果: order by),但对于非浓缩的search radius 太小,至少找不到 8 个城市...

如果找到的城市数量 search radius (x2)?

谢谢

【问题讨论】:

标签: mysql recursion trigonometry haversine


【解决方案1】:

MySQL 不支持递归查询。

您必须根据前一个查询的结果进行新的查询。

顺便说一下,对于空间查询,我推荐spatial database

【讨论】:

  • 所以现在我继续使用这个查询,如果找到的城市数量小于 8(来自 PHP),我会回调它。在接下来的几周内,我将查看 MySQL 空间扩展来比较它们(性能)。
猜你喜欢
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-17
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多