Mysql递归查询/余弦球面定律

标签 mysql recursion trigonometry haversine

我想从坐标(纬度/经度)搜索最近的位置到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 是地球半径(公里),111(公里)是 1° 纬度,cos(纬度)* 111(公里)是 1° 经度,5(公里)是搜索半径。

问题:我希望至少找到 8 个城市,但是 5 公里半径对于压缩区域(许多城市)来说很小但很快,所以如果我使用对于压缩区域来说太大的搜索半径,查询很慢(很多结果:排序依据),但对于非压缩,搜索半径太小,无法找到至少 8 个城市...

如果找到的城市数 < 8(仅使用 mysql),如何进行递归查询来自动增加搜索半径 (x2)?

谢谢

最佳答案

MySQL不支持递归查询。

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

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

关于Mysql递归查询/余弦球面定律,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4569658/

相关文章:

PHP mySQL if 语句 - 检查电子邮件是否已经在数据库中

c++ - 减少调试 session 中的堆栈大小以捕获无休止的递归

c - 用于在两个数组之间的相同位置上查找相同数字的递归函数

javascript - 在 html 中绘制正弦

C++ 创建绘制斜边的函数 - 三角函数

计算正弦到给定定点类型的全精度,什么时候停止?

mysql - 针对同一张表的不同条件获取不同的计数

mysql - #1064 - 检查与您的 MariaDB 服务器版本对应的手册以获得正确的语法?

MySQL链接两个表而没有第三个表保持关系

javascript - 在 jQuery.find() 中跳过选择器的递归?