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

时间:2016-04-11 21:07:21

标签: php 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计算行数?

1 个答案:

答案 0 :(得分:1)

您可以使用子查询:

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 spatial data types,这样您就可以do this automaticallywith indexes加快速度。