2012-01-24 3 views
23

私は現在、約10k行のデータベースがあります。それらのすべては、郵便番号の中心に基づいて経度/緯度を持っています。私は今、拡大しようとしているクエリを見つけましたが、すべてにおいて、それはある時点でうまく機能します。しかし、下の私の例では、半径25マイル以内で物事を見つけようとしています。半径25マイル以内で物事を見つけるのが大部分です。私の結果の大部分は25マイルの基準の範囲内で収量を得ていますが、私は一握りが86マイルから800マイル離れたところにあります。xqlの半径内の他の行のmySQL経度と緯度のクエリ

例: これは私の中心地である緯度/経度:37.2790669、-121.874722 =サンノゼ、CAなどの イム取得結果:33.016928、-116.846046サンノゼからおよそ355マイルで=カリフォルニア州サンディエゴ。

私の現在のクエリは次のようになります。ここでは

SELECT *,(((acos(sin(($lat*pi()/180)) * sin((`latitude`*pi()/180))+cos(($lat*pi()/180)) 
* cos((`latitude`*pi()/180)) * cos((($lon - `longitude`)*pi()/180))))*180/pi())*60*1.1515) 
AS `distance` FROM `geo_locations` HAVING `distance` <= 25 ORDER BY `distance` ASC" 

答えて

72

は、私は私が働く店舗検索に使用したクエリです:

SELECT 
    `id`, 
    (
     6371 * 
     acos(
      cos(radians(:lat)) * 
      cos(radians(`lat`)) * 
      cos(
       radians(`long`) - radians(:long) 
      ) + 
      sin(radians(:lat)) * 
      sin(radians(`lat`)) 
     ) 
    ) `distance` 
FROM 
    `location` 
HAVING 
    `distance` < :distance 
ORDER BY 
    `distance` 
LIMIT 
    25 

:lat:longポイントは、ユーザ場所によって渡されますlatおよびlongは、データベースに格納されているポイントです。

:距離はコードの作業バージョンに、マイルで測定される:距離を実際キロメートルで動作するようにコードを変更する10〜50マイル

範囲ドロップダウンから引っ張られることによって達成することができますjoshhendoのおかげで、3959(地球の中心からその地面までの距離をマイル)から6371(キロメートルに換算して3959マイル)に変更しました。

+1

あなたのために働いてくれてうれしい – Gordnfreeman

+3

Gordnfreeman、 "<25"の略語を教えてください。それは25マイルかキロメートルですか?あなたと私との素早いチャットに気をつけなければ、別の質問がありますか? – dcolumbus

+0

KMを使用するためにこれを簡単に変換できる方法はありますか?私はそれがクエリの初めに3935と関係があると推測しますが、それが何をしているのかは全く分かりません。 – joshhendo

関連する問題