Voici la requête que j'utilise sur le localisateur de magasins avec lequel je travaille :
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
et :long
sont les points passés par l'utilisateur où lat
et long
sont les points stockés dans la base de données.
La :distance est mesurée en miles, dans la version de travail du code la :distance est en fait extraite d'une liste déroulante allant de 10 à 50 miles
Changer le code pour qu'il fonctionne avec les kilomètres peut être accompli en changeant 3959 (la distance entre le centre de la terre et sa surface en miles) en 6371 (3959 miles convertis en kilomètres) grâce à joshhendo pour cette solution.