SQL如何从给定郊区5KM范围内的给定多个郊区中选择属性?
Posted
技术标签:
【中文标题】SQL如何从给定郊区5KM范围内的给定多个郊区中选择属性?【英文标题】:SQL How to select properties from given multiple suburbs within 5KM range with the given suburbs? 【发布时间】:2016-01-08 10:29:12 【问题描述】:我有两张表,如下图:
tbl_properties 和 tbl_postcodes
它应列出所选邮政编码周围 5 公里范围内的属性。
我正在尝试通过以下查询获得结果,但没有得到正确的结果。
SELECT* FROM (
选择 p.*,
圆形的(
60 * 1.1515 * 1.609344 * 度数(
ACOS(
COS(RADIANS(pc.latitude
)) * COS(RADIANS(p.lat
)) * COS(RADIANS(pc.longitude
- p.lng
)) + SIN(RADIANS(pc.@987654329) @)) * SIN(弧度(p.lng
))
)
),
2
) AS 距离
FROM properties
AS p JOIN postcodes_geo AS pc ON (p.postcode_id
= pc.id
)
在哪里 p.postcode_id IN (792,790,786,12613) ) AS ftbl WHERE 距离
【问题讨论】:
这里已经讨论了可能的解决方案:***.com/a/8994850/4737924 感谢您的帮助。这一次仅适用于一个位置。但是如果有多个邮政编码,我想搜索记录。 您可以使用 UNION 收集多个邮政编码的数据。 “没有得到正确的结果”是什么意思?您在寻找最多 5 公里外的房产吗?或至少 5 公里? @awons:UNION 需要更长的时间。如果有其他方法请建议。 【参考方案1】:以下是提供与基于邮政编码进行搜索相同的功能的网络服务。
http://www.geonames.org/export/web-services.html
这里你可以传递邮政编码和半径作为参数,它会以 XML 和 JSON 格式返回与之相关的邮政编码列表。
例如:http://api.geonames.org/findNearbyPostalCodesJSON?postalcode=2032&country=AU&radius=10&username=demo
【讨论】:
【参考方案2】:@krishna 像这样的查询怎么样
SELECT *
FROM (
SELECT properties.*
,(111.045000 * DEGREES(ACOS(COS(RADIANS(- 33.867487)) * COS(RADIANS(lat)) * COS(RADIANS(151.206990 - lng)) + SIN(RADIANS(- 33.867487)) * SIN(RADIANS(lat))))) AS distance
FROM `properties`
WHERE `properties`.`deleted_at` IS NULL
AND lat BETWEEN - 33.912514
AND - 33.822460
AND lng BETWEEN 151.152763
AND 151.261218
) AS properties
WHERE `properties`.`deleted_at` IS NULL
UNION
SELECT *
FROM (
SELECT properties.*
,(111.045000 * DEGREES(ACOS(COS(RADIANS(- 33.914437)) * COS(RADIANS(lat)) * COS(RADIANS(151.241642 - lng)) + SIN(RADIANS(- 33.914437)) * SIN(RADIANS(lat))))) AS distance
FROM `properties`
WHERE `properties`.`deleted_at` IS NULL
AND lat BETWEEN - 33.959464
AND - 33.869411
AND lng BETWEEN 151.187384
AND 151.295899
) AS properties
WHERE `properties`.`deleted_at` IS NULL
UNION
SELECT *
FROM (
SELECT properties.*
,(111.045000 * DEGREES(ACOS(COS(RADIANS(- 33.914437)) * COS(RADIANS(lat)) * COS(RADIANS(151.241642 - lng)) + SIN(RADIANS(- 33.914437)) * SIN(RADIANS(lat))))) AS distance
FROM `properties`
WHERE `properties`.`deleted_at` IS NULL
AND lat BETWEEN - 33.959464
AND - 33.869411
AND lng BETWEEN 151.187384
AND 151.295899
) AS properties
WHERE `properties`.`deleted_at` IS NULL Limit 10
,10
这可能会根据您的需要对您有所帮助,但您需要在准备查询时进行一些锻炼
【讨论】:
以上是关于SQL如何从给定郊区5KM范围内的给定多个郊区中选择属性?的主要内容,如果未能解决你的问题,请参考以下文章
如何检查(在 php 或 cakephp 中)郊区的特定纬度/经度位于特定州?