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还是公式出错了?

数据

在下面的查询中...

用户位置

城市位置

找到对象的位置

最接近用户的对象

离用户最近的对象

查询

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

请注意根据您使用的是公里还是英里来正确转换地球半径。