MySQL查询和排序方式混合:无法按位置对对象进行排序,对象是按与另一位置的距离获取的

MySQL查询和排序方式混合:无法按位置对对象进行排序,对象是按与另一位置的距离获取的,sql,geolocation,pythagorean,Sql,Geolocation,Pythagorean,我必须查询一些靠近城市的对象。它们必须根据用户的位置进行排序 所以我决定编写一个SQL查询,它使用了两倍于毕达哥拉斯公式的方法 它似乎可以得到好的对象(靠近城市),但无法根据用户的位置正确地对它们进行排序 您知道我是否正确使用了SQL,或者是公式出错了吗? 数据 在下面的查询中 distance存储对象与城市之间的距离 distance_2存储对象与用户位置之间的距离 lat和lon是对象的坐标。查询确实是在对象表中执行的 用户位置 47.643310 -2.805655 城市位置 4

我必须查询一些靠近城市的对象。它们必须根据用户的位置进行排序

所以我决定编写一个SQL查询,它使用了两倍于毕达哥拉斯公式的方法

它似乎可以得到好的对象(靠近城市),但无法根据用户的位置正确地对它们进行排序

您知道我是否正确使用了SQL,或者是公式出错了吗?

数据 在下面的查询中

  • distance
    存储对象与城市之间的距离

  • distance_2
    存储对象与用户位置之间的距离

  • lat
    lon
    是对象的坐标。查询确实是在对象表中执行的

用户位置
  • 47.643310
  • -2.805655
城市位置
  • 48.51666700

  • -2.78333300

找到对象的位置 最接近用户对象
  • 476593484

  • -27546085

到用户对象的最远距离
  • 484962385

  • -27642788

查询
选择*,
SQRT((48.51666700-lat)*(48.51666700-lat)+((-2.78333300-lon)*COS(弧度(lat))*((-2.78333300-lon)*COS(弧度(lat)))*111.325作为距离,
SQRT((47.64331000-lat)*(47.64331000-lat)+((-2.80565500-lon)*余弦(弧度(lat))*((-2.80565500-lon)*余弦(弧度(lat)))*111.325作为距离_2
来自距离小于200的1=1和可见=1的餐厅
显示顺序 最远的对象显示在最近的对象之前,这是不正常的(见下一部分)。

为了获得更高的精度(距离20英里/32公里),我建议使用大圆圈距离计算。我们生活在地球上!下面的链接中有一个很好的例子,来自堆栈溢出。这就是JarsofJam提到的哈弗森公式。 作者从PHP开始,但询问如何将其转换为纯MySQL。我相信你可以,不费吹灰之力,根据你的需要调整被接受的答案


一定要注意地球半径的正确转换,这取决于你是以公里还是以英里为单位工作。

我希望毕达哥拉斯公式中有正方形。距离公式不应该像
sqrt((48.51666700-lat)*(48.51666700-lat)+(2.78333300-lon)*(2.78333300-lon))那样作为距离吗
?Cosinus与此无关,除非你使用极坐标或类似的东西。这不是Harversine公式吗?另外:如果你用我提供的数据执行我的查询,通常你会遇到与我相同的问题。东西方向的距离取决于纬度(赤道处的距离越远,到极点的距离就越接近0)所以这部分至少还可以。我不明白的是,距离最近的物体的距离更大,我不明白为什么你仍然称之为最近的。至少,我要说的是,在数据库中排序是很好的
SELECT *, 

SQRT((48.51666700 - lat) * (48.51666700 - lat) + ((-2.78333300 - lon) * COS(RADIANS(lat))) * ((-2.78333300 - lon) * COS(RADIANS(lat)))) * 111.325 AS distance,

SQRT((47.64331000 - lat) * (47.64331000 - lat) + ((-2.80565500 - lon) * COS(RADIANS(lat))) * ((-2.80565500 - lon) * COS(RADIANS(lat)))) * 111.325 AS distance_2

FROM restaurants WHERE 1=1 AND visible = 1 HAVING distance < 200 ORDER BY distance_2 ASC