0

これは説明するのが難しいものです。半径 x マイル以内のすべての郵便番号を見つけることができます。しかし、私がやりたいことは、MaxDistance <= x zipcode である tblUsers からすべての Userid を見つけることです。

平易な英語で言えば、郵便番号に基づいて半径内にいるすべての人を知りたいです。MaxDistance

たとえば、私はテーブルを持っています:

tblUsers(ID int, Maxdistance int,郵便番号 varchar(5))
1|50|94129
2|25|94111
3|100|19019

私の2番目のテーブルでは:

tblTmpPlaces(ID int,郵便番号 varchar(5))
1|94129

私がやりたいのは、tblTmpPlaces zipcode を使用することです。ユーザー 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))
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

ここ<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でここに投稿した他の回答の1つにGCD式があります。見つけられるか見てみます。

ここで答えられた同様の質問:

MYSQLは距離がありますが、グループ化できませんか?

于 2012-12-07T20:36:38.143 に答える