在MySQL中选择基于zipcode的记录,它的半径,lat和lon

时间:2016-05-24 09:18:07

标签: mysql sql zipcode postal-code postal

以下是我的company表,其中postalcodelatlonradius以公里为单位,每家公司都可以提供他的服务。

id  company_name   city                 postalcode  radiu   latitude       longitude
 1  A              Drogteropslagen      7705 PA     10      52.61666700    6.50000000
 2  B              Coevorden            7740 AA     15      52.66666700    6.75000000
 3  C              Emmen                7812 TN     5       52.78333300    6.9000000
 4  D              Emmer-Compascuum     7881 PZ     25      52.81666700    7.05000000
 5  E              Nieuw-Dordrecht      7885 AA     60      52.75000000    6.96666700

我想选择特定邮政编码的公司,例如7813 AB生活在postalcode + radius内,即使此邮政编码7813 AB与公司的邮政编码也不完全相同。如何编写SQL查询来选择那些公司?

3 个答案:

答案 0 :(得分:2)

SELECT t1.company_name, t2.company_name,
    (6371 * acos(cos(radians(t1.lat1)) * cos(radians(t2.lat2)) 
    * cos(radians(t2.lng2) - radians(t1.lng1)) + sin(radians(t1.lat1)) * sin(radians(t2.lat2)))) AS distance,
    t1.radius
FROM
(
    SELECT company_name, latitude AS lat1, longitude AS lng1,
        radius
    FROM company
    WHERE postalcode = '7813 AB'
) t1
CROSS JOIN
(
    SELECT company_name, latitude AS lat2, longitude AS lng2
    FROM company
) t2
HAVING distance < t1.radius AND t1.company_name != t2.company_name

答案 1 :(得分:0)

您可以为longitudelatitude使用空间数据类型(或转换它们),然后使用st_difference计算差异,请参阅https://dev.mysql.com/doc/refman/5.7/en/spatial-operator-functions.html#function_st-difference

示例:

SELECT st_distance(POINT(50.0, 8.0), POINT(latitude, longitude)) FROM company;

然而,距离是近似值,适用于小距离。由于MySQL只计算平面坐标(欧几里德几何),因此距离越长,计算误差就越大。

答案 2 :(得分:0)

您需要将输入后置代码转换为长/纬度坐标。

有两种方法可以做到这一点;最高效的方法是导入一个包含邮政编码和长/纬度坐标的表格。您可以在这里找到荷兰的dataset

另一种方法是使用地理编码API;有几个可用;谷歌是你的朋友。这可能是性能问题(如果您有数千名客户同时提交邮政编码),并且可能需要API提供商的许可。

输入后置代码的long / lat后,可以使用MySQL中的地理空间逻辑来计算半径中的内容。