-3

ZipCodesとcustomersの2つのテーブルがあります。

ZipCodesにはとの列がlngありlat、顧客には。がありzipcodeます。

郵便番号の特定の距離にいるすべての顧客を取得するためのクエリが必要XXXXXです。

XXXXXの特定の距離内にあるすべての郵便番号を取得するためのクエリがあります。

SELECT ZIPCODE,( 3959 * ACOS( COS( RADIANS( $la ) ) * COS( RADIANS( LAT ) ) * COS( RADIANS( LNG ) - RADIANS( $lo ) ) + SIN( RADIANS( $la ) ) * SIN( RADIANS( LAT ) ) ) ) AS distance 
FROM ZipCodes 
HAVING distance <$rad 
ORDER BY distance 
LIMIT 0 , 20

結合がどのように機能するのか、SQLでこれをどのように表現するのかがわかりません。何か答えがあれば説明していただければ幸いです。そうでなければ私もそれを理解しています。

私の論理はこれです:

SELECT name FROM Customers WHERE Customers.zipcode = ( SELECT ZIPCODE,( 3959 * ACOS( COS( RADIANS( $la ) ) * COS( RADIANS( LAT ) ) * COS( RADIANS( LNG ) - RADIANS( $lo ) ) + SIN( RADIANS( $la ) ) * SIN( RADIANS( LAT ) ) ) ) AS distance 
FROM ZipCodes 
HAVING distance <$rad 
ORDER BY distance 
LIMIT 0 , 20) 
4

2 に答える 2

1

どうぞ。元のクエリが想定どおりの結果を返したと仮定すると、このようなものが機能するはずです。

SELECT Customers.* 
FROM Customers C 
INNER JOIN 
(
    SELECT ZIPCODE,( 3959 * ACOS( COS( RADIANS( $la ) ) * COS( RADIANS( LAT ) ) * COS( RADIANS( LNG ) - RADIANS( $lo ) ) + SIN( RADIANS( $la ) ) * SIN( RADIANS( LAT ) ) ) ) AS distance 
    FROM ZipCodes 
    HAVING distance <$rad 
    ORDER BY distance LIMIT 0 , 20
) as RelevantCodes 
  ON (C.ZipCode=RelevantCodes.ZipCode)
于 2013-02-10T00:00:59.397 に答える
0

郵便番号が丸くも小さくもないことを考えると、精度はあまり良くありません-あなたはそれを知っているべきです。

また、地球の円周は40000kmなので、1度の緯度または経度は10000 / 90〜=111kmになります。

これがあれば、距離が地球の半分未満(10000 km以下)であれば、このクエリはうまく機能するはずです。

SELECT * FROM (
    SELECT c.*,
       (   SELECT
              sqrt(pow(mod(360+lat -z.lat, 360),2)
                 + pow(mod(360+long-z.long,360),2)
              ) * 111   -- exact value is 10000 km/90 degrees
           FROM zipcodes
           WHERE zipcode = $zipcode
       ) AS distance
    FROM customers c
    JOIN zipcodes z ON (z.zipcode = c.zipcode)
) x
WHERE distance < $distance_km
ORDER BY distance
于 2013-02-10T00:06:49.283 に答える