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