2016-05-24 19 views
2

下面是我company表与它的postalcodelatlon和公里radius,每个公司能够提供他的服务。选择记录基于邮政编码,它的半径,纬度和经度在MySQL

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查询来选择这些公司?

+1

此数据示例的预期输出是什么? – sagi

+2

@sagi他已经问过这个问题[here](http://stackoverflow.com/questions/37404372/select-records-by-zipcode-and-its-radius-in-mysql/37404516?noredirect=1#comment62325499_37404516) ,但从未给我新的链接。 –

+0

@sagi我希望至少得到记录ID = 3和5,因为邮政编码7813 AB在7812 TN附近,记录ID = 5,因为它的半径是60公里,相当长,因此邮政编码7813 AB应该生活在这个区域内。这只是一个想法。最后它是基于经纬度和纬度加上这些公司的半径的计算。 –

回答

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 
+0

谢谢你试图帮助我。我试图找出把特定的邮政编码作为条件的地方,例如postalcode =“7813 AB”;因为这个邮政编码将来自最终用户的输入。 –

+0

在第一个子查询中用'WHERE postalcode ='7813 AB''替换WHERE c.company_name ='A''。 –

+0

我有以下的SQL错误:#1054 - 'where子句'中的未知列'distance'。似乎别名距离不起作用。 –

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只计算平面坐标(欧几里德几何)。

+0

你能告诉我一些基于我上面的数据库表的查询示例吗? –

+0

我已经添加了一些示例代码。 –

0

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

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

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

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

+0

如何在MySQL中使用地理空间逻辑? –