0

嗨朋友我需要这个逻辑
问题定义的帮助:

有4张桌子:

  1. 项目
    • 项目名称
    • 项目编号
    • 邮政编码
  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. 我试图在单独的表格中映射距离,但邮政编码太多

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

4

3 回答 3

0

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

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

参考

于 2014-05-08T05:52:16.277 回答
0

你可以试试最近邻搜索

看看here和这个相关的SO问题

于 2014-05-08T04:48:35.273 回答
0

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

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

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

于 2015-05-29T22:15:33.690 回答