1

以下は、postalいくつかのレコードを含む私のテーブルです。実際、このテーブルにはすべての都市とすべての郵便番号が含まれています。

id    city                 postalcode    latitude          longitude
 1    Drogteropslagen      7705 PA       52.61666700       6.50000000
 2    Coevorden            7740 AA       52.66666700       6.75000000
 3    Emmen                7812 TN       52.78333300       6.90000000
 4    Emmer-Compascuum     7881 PZ       52.81666700       7.05000000
 5    Nieuw-Dordrecht      7885 AA       52.75000000       6.96666700

以下は、company郵便番号と、各会社がサービスを提供できる半径 (キロ単位) を示した表です。

id   company_name   city              postalcode   radius   latitude      longitude
1    A              Emmen             7812 TN      10       52.78333300   6.90000000
2    B              Nieuw-Dordrecht   7885 AA      5        52.75000000   6.96666700
3    C              Drogteropslagen   7705 PA      25       52.61666700   6.50000000
4    D              Foxhol            9607 PR      0        53.16666700   6.71666700
5    E              Westerbroek       9608 PA      15       53.18333300   6.68333300

7740 AA特定の郵便番号、たとえば郵便番号と会社の半径の範囲内にある会社を選択したいと思います。特定の郵便番号が常にテーブルに存在するとは限りませんが、companyテーブルには常に存在することに注意してpostalください。それらの会社を選択するための SQL クエリの書き方。

4

2 に答える 2

1

このアプローチは、CROSS JOIN関心のある会社の 1 つのレコードを含むサブクエリと、すべての会社を含むサブクエリとの間で実行します。このクエリでは、Haversine 式を使用して、2 つの会社間の距離をキロメートル単位で計算します (詳細については、こちらを参照してください)。

このクエリは、郵便番号から半径 20 km 以内にあるすべての会社を取得するために使用するものです7740 AA

SELECT t2.company_name,
    (6371 * acos(cos(radians(t1.lat1)) * cos(radians(t2.lat2)) 
    * cos(radians(t2.lng2) - radians(t1.lng1)) + sin(radians(t1.lat1)) * sin(radians(t2.lat2)))) AS distance
FROM
(
    SELECT p.latitude AS lat1, p.longitude AS lng1
    FROM postal p
    WHERE p.postalcode = '7740 AA'
) t1
CROSS JOIN
(
    SELECT c.company_name, p.latitude AS lat2, p.longitude AS lng2
    FROM company c INNER JOIN postal p
        ON c.postalcode = p.postalcode
) t2
HAVING distance < 20
于 2016-05-24T04:40:30.943 に答える