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

Mysql 为什么此查询不返回0的结果?,mysql,coordinates,Mysql,Coordinates,使用haversine,以下查询将查找所有坐标位于输入坐标10英里半径内的行 SELECT * , ( 3959 * acos( cos( radians($locationLatitude) ) * cos( radians( endingLatitude ) ) * cos( radians( endingLongitude ) - radians( $locationLongitude ) )

使用haversine,以下查询将查找所有坐标位于输入坐标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;

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

您使用的语法不正确:必须更改位置并使用子查询,以便您可以引用计算的别名,而不必重复公式:

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表示组的聚合值的条件,例如groupbyfoo的COUNT*>3,但您没有进行任何分组;你需要一个简单的where子句


不幸的是,mysql具有宽松的分组语法,允许您的语句在没有语法错误的情况下执行,即使它在逻辑上是不合理的。在其他数据库上运行相同的查询会导致错误。

这听起来可疑,好像有什么东西不工作。您可以设置SQL FIDLE吗?我认为数据类型精度可能有问题。即使经度和纬度匹配,距离也可能不是零,这取决于数学函数中的数据类型精度。它可能不是正统的,但它是正统的OK@strawberryOP可以使用子查询引用计算结果的列别名。无论何处或何处,都无法直接做到这一点subquery@dummy我填写了占位符代码-这更清楚吗?它应该运行为is@Bohemian代码运行时,如果坐标与表中存储的坐标完全相同,则不会返回任何内容。@dummycode.com当两点收敛时,内部计算趋于1,acos1=0,因此总体结果会如预期的那样趋于0。没有被零除的可能性。我不明白为什么会有问题。你能用你正在使用的一些实际数据,包括应该可以使用但不能使用的数据,发布一个到的链接,并在完成后通知我吗