Aqui está a consulta que uso no localizador de lojas com o qual trabalho:
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
e :long
são os pontos passados pelo usuário onde lat
e long
são os pontos armazenados no banco de dados. O :distance é medido em milhas, na versão de trabalho do código o :distance é realmente puxado de uma lista suspensa que varia de 10 a 50 milhas
Alterar o código para trabalhar com quilômetros pode ser feito alterando 3959 (a distância do centro da Terra à sua superfície em milhas) para 6371 (3959 milhas convertidas em quilômetros) graças ao joshhendo por essa solução.