sql >> Base de Datos >  >> RDS >> Mysql

Obtenga resultados que se encuentren dentro de los radios de los marcadores de la base de datos

Para resolver esto, debe comprender la ecuación del círculo, que es algo como esto. Para que cualquier punto (x, y) caiga dentro del círculo con centro (x1, y1) y radio r unidades es

(x-x1)^2 + (y - y1)^2 <= r^2

where a^b = a to the power b

Aquí, en su caso, los usuarios B (latitud, longitud) son el centro del círculo, los usuarios A (latitud, longitud) son los puntos (x, y) y el radio =2 km.

Pero el problema básico es cambiar grados de latitud a longitudes, así que aquí está la solución, 1 grado =111,12 km. Así que para mantener las mismas unidades en ambos lados de la ecuación, lo convertiremos a Kms

Así que nuestra ecuación final se convierte en:

((x-x1)*111.12)^2 + ((y-y1)*111.12)^2 = 4      (=2^2) 

La declaración SQL para lo mismo debería verse así

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 esto ayude...