合并两个 MySQL 查询并获取两个邮政编码之间的距离

Posted

技术标签:

【中文标题】合并两个 MySQL 查询并获取两个邮政编码之间的距离【英文标题】:Merge two MySQL query and get distance between two zip codes 【发布时间】:2014-05-12 18:38:31 【问题描述】:

我想知道两个邮政编码之间的距离。

html 表单有一个字段,即邮政编码,英里(距离)。\

具有 7000 条记录的数据库结构。

id | name | zip_code | lat | lng | status|

mysql 查询

   $query =  "SELECT *, 3963 * acos(cos(radians(90-lat ))*cos(radians(90-'".$result['lat']."'))".
              "+sin(radians(90-lat ))* sin(radians(90-'".$result['lat']."'))".
              "*cos(radians(lng- '".$result['lng']."'))) AS distance FROM table_name".
              " WHERE memberLevel='basic' HAVING (distance < '".$miles."') 
                ORDER BY distance ASC";

我不知道将距离与输入和存储的纬度、经度进行比较的正确 MySQL 查询是什么。

【问题讨论】:

您能否更具体地了解您需要的结果集?什么控制行数?每行应该包含什么?您将向查询提供哪些参数? 先生,我更新了我的问题 【参考方案1】:

您可以使用空间函数和空间类型列http://dev.mysql.com/doc/refman/5.5/en/spatial-extensions.html

这是一个使用空间函数的好例子! http://www.mysqlperformanceblog.com/2013/10/21/using-the-new-spatial-functions-in-mysql-5-6-for-geo-enabled-applications/

或者你可以定义一个自定义函数

CREATE DEFINER=`test`@`%` FUNCTION `geoDistance`(`lon1` DOUBLE, `lat1` DOUBLE, `lon2` DOUBLE, `lat2` DOUBLE) RETURNS double LANGUAGE SQL DETERMINISTIC NO SQL SQL SECURITY DEFINER COMMENT '' BEGIN DECLARE v DOUBLE; SELECT cos(radians(lat1)) * cos(radians(lat2)) * cos(radians(lon2) - radians(lon1)) + sin(radians(lat1)) * sin(radians(lat2)) INTO v; RETURN IF(v > 1, 0, 6371000 * acos(v)); END

然后调用

SELECT geoDistance(X(point1), Y(point1), X(spoint2), Y(point2)) result comes in meters

【讨论】:

以上是关于合并两个 MySQL 查询并获取两个邮政编码之间的距离的主要内容,如果未能解决你的问题,请参考以下文章

mysql 将两个SQL语句查询结果并在一起

mysql如何查询前后各两条数据

如何在mysql选择查询中获取两个日期之间的日期列表[重复]

查找两个经度纬度之间的距离-Mysql

如何在 MySQL 中的两个日期之间获取特定日期

在mysql数据库中怎么查询出两个时间段之间的数据 ???