Heim  >  Artikel  >  Datenbank  >  Wie kann ich mithilfe von MySQL-Abfragen effizient Zeilen innerhalb eines bestimmten Meilenradius abrufen?

Wie kann ich mithilfe von MySQL-Abfragen effizient Zeilen innerhalb eines bestimmten Meilenradius abrufen?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-25 16:38:02868Durchsuche

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

MySQL-Abfrage zum Auffinden von Zeilen innerhalb eines bestimmten Meilenradius

Beim Umgang mit Datenbankabfragen, die Längen- und Breitengradkoordinaten betreffen, ist es wichtig, effizient zu sein Rufen Sie Zeilen ab, die in einen bestimmten geografischen Umkreis fallen. Um präzise Ergebnisse innerhalb eines 25-Meilen-Radius zu erzielen, nutzt die folgende Abfrage eine mathematische Formel:

<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>

Diese Abfrage verwendet eine trigonometrische Formel, um den Abstand zwischen den Koordinaten jeder Zeile und einem angegebenen mittleren Breitengrad ($lat) zu berechnen ) und Längengrad ($lon). Allerdings kann es gelegentlich zu ungenauen Ergebnissen kommen, wenn es auf einen größeren Radius erweitert wird.

Verbesserte Abfrage

Für genauere Ergebnisse sollten Sie die folgende Abfrage verwenden:

<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>

In dieser Abfrage stellen :lat und :long den vom Benutzer übergebenen mittleren Breiten- und Längengrad dar, während location die Tabelle mit den Zielzeilen ist. :distance ist der gewünschte Radius in Meilen. Durch Ersetzen von 3959 (der Abstand vom Erdmittelpunkt zur Erdoberfläche in Meilen) durch 6371 (umgerechnet in Kilometer) können stattdessen Kilometer verwendet werden.

Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe von MySQL-Abfragen effizient Zeilen innerhalb eines bestimmten Meilenradius abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn