Esta es la consulta que utilizo en el localizador de tiendas con el que trabajo:
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
y :long
son los puntos pasados por el usuario donde lat
y long
son los puntos almacenados en la base de datos.
La :distancia se mide en millas, en la versión de trabajo del código, la :distancia en realidad se extrae de un menú desplegable que va de 10 a 50 millas
Se puede cambiar el código para que funcione con kilómetros cambiando 3959 (la distancia desde el centro de la tierra hasta su superficie en millas) a 6371 (3959 millas convertidas a kilómetros) gracias a joshhendo por esa solución.