【问题标题】:Sort by distance on multiple zipcode PHP & MySql在多个邮政编码 PHP 和 MySql 上按距离排序
【发布时间】:2014-05-08 04:36:52
【问题描述】:

嗨,朋友们,我需要有关此逻辑的帮助
问题定义:

有4张桌子:

  1. 项目
    • 项目名称
    • 项目 ID
    • 邮政编码
  2. 供应商
    • 供应商 ID
    • 供应商名称
    • 电话
    • 服务区距离
  3. 供应商服务区
    • 供应商 ID
    • 服务区邮编
  4. 邮政编码详细信息
    • 邮政编码
    • 纬度
    • 经度
  • 每个项目都有一个邮政编码
  • 一个供应商可以有多个服务区邮政编码
  1. 当供应商登录时,我将获取供应商服务区域内的所有项目。

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

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

    例如:项目邮政编码 22032 和供应商邮政编码分别为 22031 和 22040:
    22032 到 22031 = 3.01 英里
    22032 到 22040 = 7.98 英里
    那么距离 = 3.01

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

我的尝试:

  1. 我尝试使用 PHP 数组和对象执行此操作,但使用大数据时会减慢进程
  2. 我尝试通过MYSQL距离计算haversine公式计算它,但无法弄清楚
  3. 我尝试在单独的表格中映射距离,但邮政编码太多

请提出任何可以花费更少时间的逻辑。

【问题讨论】:

  • 您当前的查询是什么样的? (获取供应商服务范围内的项目)
  • 您可以在查询本身中计算距离并在那里排序
  • 我将距离内的所有 service_area_zipcodes 保存在 vendor 表中,然后从项目 INNER JOIN 供应商 WHERE project_zip IN ($vendor_zipcodes) 中获取 SELECT project_name;之后我正在计算与 PHP 循环的距离

标签: php mysql haversine


【解决方案1】:

你可以试试Nearest neighbor search

看看here 和这个related SO question

【讨论】:

    【解决方案2】:

    我建议使用如下函数在你的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
    

    然后您可以调用此函数在自定义列中按距离计算和排序。

    reference

    【讨论】:

      【解决方案3】:

      我有太多相同的问题选择整个表来确定哪个更接近,我之前在这里回答过类似的问题。

      1. 首先,您需要削减 95% 的无用行,这些行在我的方法中太过分了。 How to efficiently find the closest locations nearby a given location

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-01
        • 2013-12-10
        • 2011-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-01
        • 1970-01-01
        相关资源
        最近更新 更多