私は、以下の例のように2つのテーブルを持っている、towns
とthings
、との範囲内にある近くのもの持って町のリストを取得する必要がx
その町のレコードからの距離を。緯度と経度は、距離の計算に使用されます。
私は他のいくつかの質問を見て、things
特定の1つの町の記録を取得することができましたが、近くにthings
あるすべての町のリストを取得する方法が考えられませんx
。
結果として得られた町を、x
距離内にある近くのものの数で並べ替えることができるのはボーナスです。
TOWNS
+--------+----------+---------+---------+
| townId | townName | townLat | townLng |
+--------+----------+---------+---------+
| 1 | town a | 1.5 | 1.9 |
| 2 | town b | 1.4 | 3.8 |
| 3 | town c | 2.3 | 2.7 |
| 4 | town d | 3.2 | 1.6 |
| ... | ... | ... | ... |
+--------+----------+---------+---------+
THINGS
+---------+-----------+----------+----------+
| thingId | thingName | thingLat | thingLng |
+---------+-----------+----------+----------+
| 1 | thing a | 2.1 | 3.1 |
| 2 | thing b | 1.1 | 2.3 |
| 3 | thing c | 3.2 | 0.2 |
| 4 | thing d | 1.3 | 1.1 |
| ... | ... | ... | ... |
+---------+-----------+----------+----------+
前もって感謝します
CROSS JOIN
町と物の可能なすべての組み合わせを取得してから、各町と物の間のハバーシン距離を計算することができます。私はSELECT DISTINCT
、町が結果セットに1回だけリストされるようにするために使用します。
SELECT DISTINCT TOWNS.townName FROM
TOWNS CROSS JOIN THINGS
WHERE 3959 * acos(
cos(radians( TOWNS.townLat ))
* cos(radians( THINGS.thingLat ))
* cos(radians( TOWNS.townLng ) - radians( THINGS.thingLng ))
+ sin(radians( TOWNS.townLat ))
* sin(radians( THINGS.thingLat ))
) < x
私が使用した式x
はマイル単位です(地球の平均半径は3959マイルです)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加