首頁 >資料庫 >mysql教程 >如何使用MySQL查詢高效檢索指定英里半徑內的行?

如何使用MySQL查詢高效檢索指定英里半徑內的行?

Patricia Arquette
Patricia Arquette原創
2024-10-25 16:38:02966瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn