2

下面是我的company表格,其中包含、postalcode和每家公司能够提供服务的公里数。latlonradius

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+ the内的公司radius,即使这个邮政编码7813 AB与公司的邮政编码不完全相同。如何编写一个 sql 查询来选择那些公司?

4

3 回答 3

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
于 2016-05-24T09:35:12.713 回答
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 只计算平面坐标(欧几里得几何)。

于 2016-05-24T09:56:26.807 回答
0

您需要将输入的邮政编码转换为长/纬度坐标。

有两种方法可以做到这一点; 最高效的方法是导入带有邮政编码和长/纬度坐标的表格。您可以在此处找到荷兰的数据集。

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

一旦你有了输入邮政编码的长/纬度,你就可以使用 MySQL 中的地理空间逻辑来计算半径中的内容。

于 2016-05-24T11:17:18.380 回答