返回MYSQL中基于lat/lng的匹配距离查询的行数


Return count of rows matching distance query based on lat/lng in MYSQL?

我使用此查询来查找某个距离内的提供商,我知道这不是理想的方法,而且它只会在乌鸦飞的时候返回半准确的距离,但距离必须计算太多次才能使用任何第三方API的。

SELECT ( 3959 * acos( cos( radians('28.65') ) * cos( radians( lat ) ) * cos( radians( lon ) - radians('-81.21') ) + sin( radians('28.65') ) * sin( radians( lat ) ) ) ) AS distance FROM providers HAVING distance < 10

这很好,可以返回10英里内的所有提供商,但我想返回一个结果计数,类似于这样:

SELECT COUNT(providers.id) AS rowcount, ( 3959 * acos( cos( radians('28.65') ) * cos( radians( lat ) ) * cos( radians( lon ) - radians('-81.21') ) + sin( radians('28.65') ) * sin( radians( lat ) ) ) ) AS distance FROM providers HAVING distance < 10

不幸的是,这不起作用。

在查询中还有其他方法可以做到这一点吗?或者之后我必须用PHP计算行数吗?

您可以使用子查询:

SELECT COUNT(*) FROM (
    SELECT (3959 * ACOS(COS(RADIANS('28.65')) * COS(RADIANS(`lat`)) * COS(RADIANS(`lon`) - RADIANS('-81.21')) + SIN(RADIANS('28.65')) * SIN(RADIANS(lat)))) AS distance
    FROM providers
    HAVING distance < 10
)

内部查询是原始查询,然后外部查询对结果进行计数。

正如评论中提到的,您应该更改数据库以使用MySQL的空间数据类型,这将允许您自动执行此操作,并使用索引使其更快。