按距离排序在多个邮编PHP &MySql
Sort by distance on multiple zipcode PHP & MySql
朋友们好,我需要帮助这个逻辑
问题定义:
有4个表:
- 项目
- 供应商
- 供应商服务区域
- Zipcode细节
当供应商登录时,我将获得供应商服务区域内的所有项目。
例子:如果供应商在他的服务区域有两个邮政编码22032和10031,他的服务区域距离是20英里,那么这些服务区域内的所有项目都在20英里左右。
我正在计算项目邮编和供应商邮编之间的距离,并在一列中显示最小距离
例如:项目邮编22032和供应商邮编22031和22040:
22032至22031 = 3.01英里
22032 ~ 22040 = 7.98英里
Then Distance = 3.01
问题:现在客户端要按距离排序
我的尝试:
- 我尝试用PHP数组和对象做这个,但有大数据,这是缓慢的进程
- 我试图从MYSQL的距离计算haversine公式计算它,但无法计算出
- 我试图在单独的表中映射距离,但有太多的邮政编码
你可以试试最近邻搜索
看一下这里和这个相关的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
然后你可以调用这个函数来计算和排序你的自定义列的距离。
参考
我也有同样的问题,太多的选择整个表,只是为了找出哪个更接近,我之前回答过类似的问题。
首先,你需要削减95%的无用行,这是我这里的方法太远了。如何有效地找到给定位置附近最近的位置
收集数组中距离内的所有邮政编码,并使用所需的所有信息对该数组进行另一次查询,计算每个到目标的距离并按ASC进行排序。