【问题标题】:SQL How to select properties from given multiple suburbs within 5KM range with the given suburbs?SQL如何从给定郊区5KM范围内的给定多个郊区中选择属性?
【发布时间】:2016-01-08 10:29:12
【问题描述】:

我有两张表,如下图:

tbl_propertiestbl_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 距离

【问题讨论】:

  • 这里已经讨论了可能的解决方案:stackoverflow.com/a/8994850/4737924
  • 感谢您的帮助。这一次仅适用于一个位置。但是如果有多个邮政编码,我想搜索记录。
  • 您可以使用 UNION 收集多个邮政编码的数据。
  • “没有得到正确的结果”是什么意思?您在寻找最多 5 公里外的房产吗?或至少 5 公里?
  • @awons:UNION 需要更长的时间。如果有其他方法请建议。

标签: php mysql sql properties postal-code


【解决方案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
    

    这可能会根据您的需要对您有所帮助,但您需要在准备查询时进行一些锻炼

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 2020-01-22
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      相关资源
      最近更新 更多