代码之家  ›  专栏  ›  技术社区  ›  JarsOfJam-Scheduler

mysql查询混合了behaving和order-by:对象与位置排序失败,对象与另一位置的距离被获取

  •  0
  • JarsOfJam-Scheduler  · 技术社区  · 5 年前

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

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

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

    你知道我是正确使用SQL还是错误的公式?

    数据

    在下面的查询中…

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

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

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

    用户位置

    • 四十七点六四三三一零
    • -2.805655

    城市定位

    • 四十八点五一六六六七零零

    • -2.7833 3300

    找到对象的位置

    最接近用户对象

    • 四亿七千六百五十九万三千四百八十四

    • - 27546085

    对用户对象最远

    • 四亿八千四百九十六万二千三百八十五

    • - 27642788

    查询

    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
    

    显示顺序

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

    1 回复  |  直到 5 年前
        1
  •  1
  •   markaaronky    5 年前

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

    MySql Great Circle distance calculation

    请注意,地球半径的正确转换取决于你的工作单位是公里还是英里。