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范围内的给定多个郊区中选择属性?的主要内容,如果未能解决你的问题,请参考以下文章

SQL:如何显示给定范围内的所有日期?

如何检查(在 php 或 cakephp 中)郊区的特定纬度/经度位于特定州?

郊区春游

在 ASP.Net MVC (LINQ) 中将嵌套数据从控制器传递到视图

如何从单个表中对多行进行分组并获取给定范围内的所有记录

如何有效地获得给定范围内的除数之和?