Maison  >  Article  >  base de données  >  Comment récupérer efficacement des lignes dans un rayon de milles spécifié à l'aide de requêtes MySQL ?

Comment récupérer efficacement des lignes dans un rayon de milles spécifié à l'aide de requêtes MySQL ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-25 16:38:02868parcourir

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

Requête MySQL pour localiser des lignes dans un rayon de mille spécifié

Lorsque vous traitez des requêtes de base de données impliquant des coordonnées de longitude et de latitude, il devient essentiel de gérer efficacement récupérer les lignes tombant dans un rayon géographique spécifique. Pour obtenir des résultats précis dans un rayon de 25 miles, la requête suivante exploite une formule mathématique :

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

Cette requête utilise une formule trigonométrique pour calculer la distance entre les coordonnées de chaque ligne et une latitude centrale spécifiée ($lat ) et la longitude ($lon). Cependant, elle peut parfois produire des résultats inexacts lorsqu'elle est étendue à un rayon plus grand.

Requête améliorée

Pour des résultats plus précis, envisagez d'utiliser la requête suivante :

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

Dans cette requête, :lat et :long représentent la latitude et la longitude centrale transmises par l'utilisateur, tandis que location est la table contenant les lignes cibles. :la distance est le rayon souhaité en miles. En remplaçant 3959 (la distance entre le centre de la Terre et sa surface en miles) par 6371 (converti en kilomètres), les kilomètres peuvent être utilisés à la place.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn