【问题标题】:Mysql - distance parameter search finding all targets within distance of central location using individual preferenceMysql - 距离参数搜索使用个人偏好查找中心位置距离内的所有目标
【发布时间】:2021-04-15 14:04:07
【问题描述】:

这是一个很难解释的问题。我能够找到 x 英里半径内的所有邮政编码。但是我想做的是从 tblUsers 中找到 MaxDistance 为

所以用简单的英语,我想根据他们的MaxDistance了解邮政编码半径内的所有人

例如我有一张桌子:

tblUsers(ID int, Maxdistance int,Zipcode varchar(5)) 1|50|94129 2|25|94111 3|100|19019

在我的第二张桌子上:

tblTmpPlaces(ID int,Zipcode varchar(5)) 1|94129

我想要做的是使用 tblTmpPlaces 邮政编码,我希望能够说嘿用户 1 和 2 在他们的最大距离内并选择这些。但是,用户 3 的最大距离为 100,并且与 tblTmpPlaces 邮政编码 94129 的距离不够近。94129 是旧金山,19019 是费城。用户距离旧金山 100 多英里。

这是我一直用来获取距离的方法,但它使用中心位置来查找区域内的所有内容,但它没有考虑 MaxDistance。任何帮助表示赞赏。

所以基本上select ID from tblUsers where 这是我遇到的部分

SELECT Zipcode
             FROM tblZipcodes
            WHERE (  3959
                   * acos(
                            cos(
                               radians(
                                  @XLocationParam))
                          * cos(
                               radians(
                                  x(location)))
                          * cos(
                                 radians(
                                    y(location))
                               - radians(
                                    @YLocationParam))
                        +   sin(
                               radians(
                                  @XLocationParam))
                          * sin(
                               radians(
                                  x(location)))) <= 30))

【问题讨论】:

  • 迈克,你能根据你上面的数据告诉我们预期的输出吗? :)
  • 只有 MySQL 还是可以在后台使用 PHP?我更喜欢 PHP,否则需要子查询。
  • @JamesCameron 仅限 MySQL
  • @bonCodigo ~我想说嘿用户 1 和 2 在他们的最大距离内,然后选择这些你会在选择中获得用户 1/2

标签: mysql geospatial spatial


【解决方案1】:

看起来您确实需要每个邮政编码“中心”的纬度和经度。没有它,MySQL 无法计算邮政编码之间的距离。

tblZipcodeLatLong
( Zipcode   varchar(5)
, latitude  decimal(7,4)
, longitude decimal(7,4)
)

然后您可以使用大圆距离 (GCD) 公式计算所有邮政编码之间的距离。

不过,为了提高性能,您可能不想在每个单独的查询中都这样做,而是希望预先计算所有邮政编码之间的距离,并将计算得到的距离存储在一个表中。

SELECT p1.Zipcode AS p1_Zipcode
     , p2.Zipcode AS p2_Zipcode
     , <gcd_formula> AS distance
  FROM tblZipcodeLatLong p1
 CROSS
  JOIN tblZipcodeLatLong p2

&lt;gcd_distance&gt; 代表您的大圆距离公式,用于计算所有邮政编码之间的距离。

这种形式的查询将返回您正在寻找的结果集:

SELECT u.*, p.*
  FROM tblTmpPlaces p
  JOIN (
         SELECT p1.Zipcode AS p_Zipcode
              , p2.Zipcode AS u_Zipcode
              , <gcd_formula> AS distance
           FROM tblZipcodeLatLong p1 
          CROSS
           JOIN tblZipcodeLatLong p2
       ) d
    ON d.p_Zipcode = p.Zipcode
  JOIN tblUsers u 
    ON u.Zipcode = d.u_Zipcode
   AND u.Maxdistance >= d.distance
 WHERE p.Zipcode = '94129'

正如我之前提到的,执行交叉连接操作并在每个查询上计算该子查询(别名为 d)中的所有这些距离可能会产生相当大的开销。出于性能考虑,您可能希望预先计算这些结果,将其存储在适当索引的表中,然后将该子查询替换为对预填充表的引用。


注意:

我在不久前在 stackoverflow 上发布的其他答案之一中有一个 GCD 公式。我看看能不能找到。

这里回答了类似的问题:

MYSQL sorting by HAVING distance but not able to group?

【讨论】:

    【解决方案2】:

    做了完全相同的事情,如果我能理解,你已经得到了邮政编码(可能在一个数组中)简单的事情就是使用 SQL 中的 IN 运算符找到这些邮政编码与相应用户的匹配 选择 * 来自用户 WHERE zipcode IN zipcodes_array; zipcodes_array 是你已经拥有的数组

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 2011-08-26
      • 1970-01-01
      • 2011-09-28
      • 2011-08-20
      相关资源
      最近更新 更多