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

Få resultater, der falder inden for markørradius fra databasen

For at løse dette er du nødt til at forstå cirkelligningen, som er noget i retning af denne For at ethvert punkt (x,y) skal falde inden for en cirkel med centrum (x1, y1) og radius r enheder er

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

where a^b = a to the power b

Her i dit tilfælde er bruger B'er (breddegrad, længdegrad) cirklens centrum, bruger A'er (breddegrad, længdegrad) er punkterne (x,y) og radius =2 km.

Men det grundlæggende problem er at ændre breddegrader til længdegrader, så her er løsningen, 1 grad =111,12 km. Så for at holde enheder ens på begge sider af ligningen, vil vi konvertere den til Kms

Så vores endelige ligning bliver:

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

SQL-sætning for det samme skulle se sådan ud

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

Håber dette vil hjælpe...



  1. Postgres dato overlappende begrænsning

  2. Hvilke situationer får Oracle-pakker til at blive ugyldige?

  3. Sådan håndteres Play Framework 2-databaseudviklinger i produktionen

  4. Flersproget datatype i MYSQL