以下是我的company
表,其中postalcode
,lat
,lon
和radius
以公里为单位,每家公司都可以提供他的服务。
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查询来选择那些公司?
答案 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)
您可以为longitude
和latitude
使用空间数据类型(或转换它们),然后使用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中的地理空间逻辑来计算半径中的内容。