Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Obtenha resultados que se enquadram nos raios do marcador do banco de dados


Para resolver isso, você precisa entender a equação do círculo, que é algo assim Para qualquer ponto (x,y) cair dentro do círculo com centro (x1, y1) e raio r unidades é
(x-x1)^2 + (y - y1)^2 <= r^2

where a^b = a to the power b

Aqui no seu caso os usuários B (latitude, longitude) são o centro do círculo, os usuários A (latitude, longitude) são os pontos (x,y) e raio =2kms.

Mas o problema básico é mudar graus de latitudes para longitudes, então aqui está a solução, 1 grau =111,12 km. Então, para manter as unidades iguais em ambos os lados da equação, vamos convertê-la para Kms

Então nossa equação final fica:
((x-x1)*111.12)^2 + ((y-y1)*111.12)^2 = 4      (=2^2) 

A instrução SQL para o mesmo deve ser algo assim
SELECT A.user_id, A.radius_id, A.latitude, A.logitude
FROM UserA AS A, 
     (SELECT user_id, latitude, longitude 
       FROM UserB 
       WHERE user_id = 8) AS B
WHERE (POW((A.latitude-B.latitude)*111.12, 2) + POW((A.longitude - B.longitude)*111.12, 2)) <= 4
/* **Edit** Here I have used (A.longitude - B.longitude)*111.12, for more accurate results one can replace it with (A.longitude - B.longitude)*111.12*cos(A.latitude)) or (A.longitude - B.longitude)*111.12*cos(B.latitude)) 

And, as i have suggested in the comments that first filter some records based on approximation, so whether one uses A.latitude or B.latitude it will not make much difference */

Espero que isso ajude...