Mysql
 sql >> Database >  >> RDS >> Mysql

Ottieni risultati che rientrano nei raggi dell'indicatore dal database

Per risolvere questo problema devi capire l'equazione del cerchio, che è qualcosa del genere Per qualsiasi punto (x,y) che cada all'interno di un cerchio con unità di centro (x1, y1) e raggio r è

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

where a^b = a to the power b

Qui nel tuo caso l'utente B (latitudine, longitudine) è il centro del cerchio, l'utente A (latitudine, longitudine) sono i punti (x, y) e raggio =2 km.

Ma il problema di base è cambiare i gradi di latitudine in longitudini, quindi ecco la soluzione, 1 grado =111,12 km. Quindi, per mantenere le unità uguali su entrambi i lati dell'equazione, lo convertiremo in Km

Quindi la nostra equazione finale diventa:

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

L'istruzione SQL per lo stesso dovrebbe assomigliare a questa

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 */

Spero che questo ti aiuterà...