使用hasrsine,以下查询将查找坐标位于输入坐标半径10英里范围内的所有行。
SELECT *
, ( 3959 * acos( cos( radians($locationLatitude) )
* cos( radians( endingLatitude ) )
* cos( radians( endingLongitude ) - radians( $locationLongitude ) )
+ sin( radians( $locationLatitude) )
* sin( radians( endingLatitude ) ) ) ) AS distance
FROM trips
HAVING distance < 10
ORDER
BY distance
LIMIT 0 , 10;
但是,它不会返回与输入的坐标具有相同精确坐标的行。这是为什么?
答案 0 :(得分:2)
您使用了错误的语法:将HAVING
更改为WHERE
并使用子查询,以便您可以参考计算的别名而不必重复公式:
select * from (
select *, ( 3959 * acos( cos( radians($locationLatitude) )
* cos( radians( endingLatitude ) )
* cos( radians( endingLongitude ) - radians( $locationLongitude ) )
+ sin( radians( $locationLatitude) )
* sin( radians( endingLatitude ) ) ) ) AS distance
from trips) x
WHERE distance < 10
ORDER BY distance
LIMIT 0, 10
HAVING
适用于群组的汇总值,例如GROUP BY FOO HAVING COUNT(*) > 3
,但您不进行任何分组;你需要一个简单的where子句。
不幸的是,mysql有&#34; lenient&#34;分组语法允许您的语句在没有语法错误的情况下执行,即使它在逻辑上不合理。在其他数据库上运行的相同查询将导致错误。