代码之家  ›  专栏  ›  技术社区  ›  Valentin Golev

如何按距离给定点的距离对行进行排序,mysql?

  •  5
  • Valentin Golev  · 技术社区  · 14 年前

    我想从我的桌子上拿100分,离一个给定的点的距离最小。

    我在用

    SELECT *, GLENGTH(
                LINESTRINGFROMWKB(
                  LINESTRING(
                    ASBINARY(
                      POINTFROMTEXT("POINT(40.4495 -79.988)")
                    ),
                    ASBINARY(pt)
                  )
                )
              )
     AS `distance` FROM `ip_group_city` ORDER BY distance LIMIT 100
    

    (是的,那很痛苦。我刚在谷歌上搜索过。我不知道如何正确测量MySQL中的距离)

    执行需要很长时间。 EXPLAIN 说没有 possible_keys .

    我创造了一个 SPATIAL 指数 pt 专栏:

    CREATE SPATIAL INDEX sp_index ON  ip_group_city (pt);
    

    虽然我真的不知道如何正确地使用它。你能帮帮我吗?

    3 回复  |  直到 12 年前
        1
  •  6
  •   Nguyen Viet Anh    12 年前

    因为您没有WHERE子句,所以没有受影响的索引。我认为您应该通过使用mbr_uu(mysql 5.0或更高版本)或st_u函数(mysql 5.6或更高版本)来改进这个查询。 类似:

    SELECT *, GLENGTH(
                LINESTRINGFROMWKB(
                  LINESTRING(
                    ASBINARY(
                      POINTFROMTEXT("POINT(40.4495 -79.988)")
                    ),
                    ASBINARY(pt)
                  )
                )
              )
     AS `distance` 
    FROM `ip_group_city` 
    WHERE
    MBRWithin(
            pt, -- your point
            GeomFromText('Polygon( -- your line (in polygon format) from pt to target point 
                            (
                                #{bound.ne.lat} #{bound.ne.lng}, --North East Lat - North East Long
                                #{bound.ne.lat} #{bound.sw.lng}, --North East Lat - South West Long
                                #{bound.sw.lat} #{bound.sw.lng}, --
                                #{bound.sw.lat} #{bound.ne.lng},
                                #{bound.ne.lat} #{bound.ne.lng}
                            )
                        )')
          )
    ORDER BY distance LIMIT 100
    
        2
  •  0
  •   Community Navdeep Singh    7 年前

    我已经用过了 great circle equation 在过去进行这些类型的计算。我不确定性能如何比较,但可能值得尝试和比较。

    Here 是一篇很好的关于如何在MySQL中完成它的文章。

        3
  •  -1
  •   Community Navdeep Singh    7 年前