按距离排序在多个邮编PHP &MySql


Sort by distance on multiple zipcode PHP & MySql

朋友们好,我需要帮助这个逻辑
问题定义:

有4个表:

  1. 项目
      项目名称>项目Id
    • Zipcode
  2. 供应商
    • 供应商Id
    • 供应商名称
    • 手机
    • 服务区域距离
  3. 供应商服务区域
    • 供应商Id
    • 服务区域邮编
  4. Zipcode细节
    • zipcode
    • <
    • 经度/gh>
  • 每个项目都有一个邮编
  • 供应商可以有多个服务区域邮编
  1. 当供应商登录时,我将获得供应商服务区域内的所有项目。

    例子:如果供应商在他的服务区域有两个邮政编码22032和10031,他的服务区域距离是20英里,那么这些服务区域内的所有项目都在20英里左右。

  2. 我正在计算项目邮编和供应商邮编之间的距离,并在一列中显示最小距离

    例如:项目邮编22032和供应商邮编22031和22040:
    22032至22031 = 3.01英里
    22032 ~ 22040 = 7.98英里
    Then Distance = 3.01

问题:现在客户端要按距离排序

我的尝试:

  1. 我尝试用PHP数组和对象做这个,但有大数据,这是缓慢的进程
  2. 我试图从MYSQL的距离计算haversine公式计算它,但无法计算出
  3. 我试图在单独的表中映射距离,但有太多的邮政编码

你可以试试最近邻搜索

看一下这里和这个相关的SO问题

我建议在mysql中使用一些函数来定义距离公式:

CREATE DEFINER=`root`@`localhost` FUNCTION `calc_distance`(`p1lat` DECIMAL(10,5), `p1long` DECIMAL(10,5), `p2lat` DECIMAL(10,5), `p2long` DECIMAL(10,5)) RETURNS decimal(10,5)
    NO SQL
BEGIN
    DECLARE radius INT;
    DECLARE deg_per_rad DECIMAL;
    SET radius = 3958;
    SET deg_per_rad = 57.29578;
    RETURN      (radius * PI() * SQRT(
                (p1lat-p2lat)
                * (p1lat - p2lat)
                + cos(p1lat / deg_per_rad)
                * cos(p2lat / deg_per_rad)
                * (p1long - p2long)
                * (p1long - p2long)
                )/180);
END

然后你可以调用这个函数来计算和排序你的自定义列的距离。

参考

我也有同样的问题,太多的选择整个表,只是为了找出哪个更接近,我之前回答过类似的问题。

  1. 首先,你需要削减95%的无用行,这是我这里的方法太远了。如何有效地找到给定位置附近最近的位置

  2. 收集数组中距离内的所有邮政编码,并使用所需的所有信息对该数组进行另一次查询,计算每个到目标的距离并按ASC进行排序。

相关文章: