ホームページ  >  記事  >  データベース  >  MySQL クエリを使用して、指定したマイル半径内の行を効率的に取得する方法

MySQL クエリを使用して、指定したマイル半径内の行を効率的に取得する方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-25 16:38:02868ブラウズ

How to Efficiently Retrieve Rows within a Specified Mile Radius using MySQL Queries?

指定されたマイル半径内の行を検索するための MySQL クエリ

経度と緯度の座標を含むデータベース クエリを処理する場合、効率的に特定の地理的半径内にある行を取得します。半径 25 マイル以内で正確な結果を得るために、次のクエリでは数式を利用します。

<code class="sql">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</code>

このクエリでは、三角関数の公式を使用して、各行の座標と指定された中心緯度 ($lat) の間の距離を計算します。 ) と経度 ($lon)。ただし、より大きな範囲に拡張すると、不正確な結果が生成される場合があります。

クエリの改善

より正確な結果を得るには、次のクエリの使用を検討してください:

<code class="sql">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</code>

このクエリでは、:lat と :long はユーザーによって渡された中心の緯度と経度を表し、location はターゲット行を含むテーブルです。 : distance は、目的の半径をマイル単位で指定します。 3959 (地球の中心から地表までの距離をマイル単位) を 6371 (キロメートルに変換) に置き換えることで、キロメートルを代わりに使用できます。

以上がMySQL クエリを使用して、指定したマイル半径内の行を効率的に取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。