0

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

所以我决定编写一个使用两倍毕达哥拉斯公式的 SQL 查询。

它似乎得到了好的对象(靠近城市),但它未能根据用户的位置正确分类它们。

你知道我是否正确使用 SQL 还是公式出错了?

数据

在以下查询中...

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

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

  • latlon是物体的坐标。查询确实在对象表中执行。

用户位置

  • 47.643310
  • -2.805655

城市的位置

  • 48.51666700

  • -2.78333300

找到对象的位置

最接近用户的对象

  • 47,6593484

  • -2,7546085

Farest-to-the-user 对象

  • 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

展示顺序

最远的对象显示在最近的对象之前,这是不正常的(见下一部分)。

4

1 回答 1

1

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

MySql大圆距离计算

请注意根据您是以公里还是英里为单位工作的地球半径的正确转换。

于 2019-01-22T19:17:45.233 回答