MySQL 混合 HAVING 和 ORDER BY 的查询:无法根据位置对对象进行排序,而对象是根据与另一个位置的距离获取的
MySQL query mixing HAVING and ORDER BY: failing in sorting objects with a location, objects being got by distance with another location
我必须查询一些靠近城市的对象。它们必须根据用户的位置进行排序。
所以我决定编写一个 SQL 查询,它使用两倍的毕达哥拉斯公式。
好像拿到了好东西(靠近city),但是没能按照用户的位置正确排序。
你知道我是用对了SQL还是公式出错了?
数据
在下面的查询中...
distance
存储物体到城市的距离
distance_2
存储对象与用户位置之间的距离。
lat
和lon
是对象的坐标。该查询确实在对象的table中执行。
用户位置
- 47.643310
- -2.805655
城市位置
48.51666700
-2.78333300
找到对象的位置
最接近用户的对象
47,6593484
-2,7546085
离用户最近的对象
48,4962385
-2,7642788
查询
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
显示顺序
最远的物体显示在最近的物体之前,这是不正常的(见下一部分)。
为了更准确(距离 20 miles/32 公里),我建议考虑使用大圆距离计算。我们生活在地球上! Stack Overflow 下方的 link 中有一个很好的示例。这就是 JarsofJam 提到的 Haversine 公式。
作者从 PHP 开始,但询问如何将其转换为纯 MySQL。我相信您可以轻松地根据您的需要调整已接受的答案。
MySql Great Circle distance calculation
请注意根据您使用的是公里还是英里来正确转换地球半径。
我必须查询一些靠近城市的对象。它们必须根据用户的位置进行排序。
所以我决定编写一个 SQL 查询,它使用两倍的毕达哥拉斯公式。
好像拿到了好东西(靠近city),但是没能按照用户的位置正确排序。
你知道我是用对了SQL还是公式出错了?
数据
在下面的查询中...
distance
存储物体到城市的距离distance_2
存储对象与用户位置之间的距离。lat
和lon
是对象的坐标。该查询确实在对象的table中执行。
用户位置
- 47.643310
- -2.805655
城市位置
48.51666700
-2.78333300
找到对象的位置
最接近用户的对象
47,6593484
-2,7546085
离用户最近的对象
48,4962385
-2,7642788
查询
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
显示顺序
最远的物体显示在最近的物体之前,这是不正常的(见下一部分)。
为了更准确(距离 20 miles/32 公里),我建议考虑使用大圆距离计算。我们生活在地球上! Stack Overflow 下方的 link 中有一个很好的示例。这就是 JarsofJam 提到的 Haversine 公式。 作者从 PHP 开始,但询问如何将其转换为纯 MySQL。我相信您可以轻松地根据您的需要调整已接受的答案。
MySql Great Circle distance calculation
请注意根据您使用的是公里还是英里来正确转换地球半径。