2016-04-18 4 views
3

を検索しています。データベースのpuesdo座標の連絡先の一覧がデータベースにあります。ここにサンプルがあります:遠方にあるSQL

name e_point n_point 
David 102  345 
James 174  746 
Ali  460  584 
Kevin 364  479 
Mark 385  274 

私は2つの座標の距離内で検索できるクエリを作成することは可能ですか?たとえば、私はジェームスの半径20平方マイル以内に住む人々のリストが必要です。

これを行うのに役立つ機能は何ですか?

+0

「プシュドコーディネーション」が何を意味しているのか分かっていると思う。私はこの言葉を探査しましたが、意味を説明するものは何も見つかりませんでした。 –

+0

@Tin Tran:これらのpuesdo座標は基本的に東と北の座標です。私はちょうど実物に移動する前に、短い数字のあるものをテストとして使いたいと思っていました。 – mrteeth

+0

だからe_pointは-xのようになり、n_pointは-yのようになりますか? –

答えて

2

MySQLの構文:

SELECT name FROM `table` WHERE SQRT(
POW(e_point - (SELECT e_point FROM `table` WHERE name='james'), 2) + 
POW(n_point - (SELECT n_point FROM `table` WHERE name='james'), 2)) < 20 
AND name <> 'james' 

お知らせ:

  1. あなたは3ヶ所で '名前' を変更する必要があります。
  2. サブクエリを追加すると、1つの変数(名前)で1つのクエリを実行できます。あなたはサブクエリを削除する場合は、(近くの人を探しCOORDを取得する最初のクエリ、および2番目のクエリ)2つのクエリを実行する必要が
  3. 式は次のとおりです。
  4. P1 =(P1X、P1Y)

enter image description here

とp2 =(p2x、p2y)

+0

コードと使用された数式について説明した方が良いでしょう。 – Schwern

+0

@ジェラルド:提案していただきありがとうございます。私は 'POW'と' SQRT'関数について説明することができますか?また、なぜサブクエリの背後にある理由がありますか。私はコードの背後にある論理的根拠について知りたいからです。 – mrteeth

+0

回答の編集:方程式とクエリの説明 –

2

Great-circle distanceを取得する必要がある2つの座標間の距離を計算するには、地球が丸められ、距離の測定値がこの影響を受けるためです。

enter image description here

SQLでこれを行うと、Google Maps API docsによると、このようなものになるだろう:あなたの座標は、xとyのように表している場合

SELECT id, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) 
AS distance 
FROM markers 
HAVING distance < 25 
ORDER BY distance 
LIMIT 0 , 20; 
+0

巨大な円の距離はおそらく20マイルの過度の距離です。それが飛行機にあると仮定すれば、違いは何ですか? – Schwern

+0

@Danny H:提案とコードに感謝します。私はこれが緯度と経度であると仮定していますか?他の座標にも使えますか? – mrteeth

1

あなたはこのようなものを使用することができます座標(ただの出現を置き換えますcontactsと実際のテーブル名との距離)返される距離は「James」からの距離です。

SELECT T2.name, 
     SQRT(POWER(T2.e_point-T1.e_point,2)+ 
      POWER(T2.n_point-T1.n_point,2)) as distance 
FROM contacts T1 
INNER JOIN contacts T2 ON 
    SQRT(POWER(T2.e_point-T1.e_point,2)+ 
     POWER(T2.n_point-T1.n_point,2)) <= 20 
WHERE T1.name = 'James' 
AND T1.name != T2.name 

sqlfiddle

+0

クール、ありがとう!ところで、 'SQRT'と' POWER'関数を使った理由を説明できますか?ちょっとだけコードを理解したい。 – mrteeth

+0

SQRTは、sqrt(9)のような数値の平方根を3にします。POWER()は、POWER(3,2)のような数値の指数を2乗に3にします。 ..そして全体の公式はちょうどピタゴラスの定理に基づいている。 –

+0

ああ、そうです。説明のため。私はピタゴラスの定理式を見て、それは理にかなっています。 – mrteeth

関連する問題