0

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

所以用简单的英语我想知道所有在邮政编码范围内的人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 是费城。用户距离 San Fran 超过 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))
4

2 回答 2

0

看起来您确实需要每个邮政编码的“中心”的纬度和经度。没有它,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

Where<gcd_distance>代表您的大圆距离公式,用于计算所有邮政编码之间的距离。

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

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 按 HAVING 距离排序但无法分组?

于 2012-12-07T20:36:38.143 回答
0

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

于 2021-04-15T06:04:07.717 回答