我使用此查询在一定距离内查找提供商,我知道这不是一种理想的方法,它只会在乌鸦飞行时返回半精确距离,但距离很近必须计算太多次才能使用任何第三方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计算行数?
答案 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 automatically和with indexes加快速度。