为什么此查询不会返回0的结果?

时间:2015-03-12 13:12:20

标签: mysql coordinates

使用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;

但是,它不会返回与输入的坐标具有相同精确坐标的行。这是为什么?

1 个答案:

答案 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;分组语法允许您的语句在没有语法错误的情况下执行,即使它在逻辑上不合理。在其他数据库上运行的相同查询将导致错误。