sql >> Databasteknik >  >> RDS >> Mysql

Få resultat som faller inom markörradier från databasen

För att lösa detta måste du förstå cirkelekvationen, som är ungefär så härFör att varje punkt (x,y) ska falla inom cirkel med centrum (x1, y1) och radie r enheter är

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

where a^b = a to the power b

Här i ditt fall är användare B:s (latitud, longitud) cirkelns mittpunkt, användare A:s (latitud, longitud) är punkterna (x,y) och radien =2kms.

Men det grundläggande problemet är att ändra breddgrader till longituder, så här är lösningen, 1 grad =111,12 km. Så för att hålla enheter lika på båda sidor av ekvationen kommer vi att konvertera den till Kms

Så vår slutliga ekvation blir:

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

SQL-sats för samma bör se ut ungefär så här

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

Hoppas detta hjälper...



  1. SQL Hur man uppdaterar SUMMA för kolumn över grupp i samma tabell

  2. MySQL arbetsbänk tabell data import guiden extremt långsam

  3. Hur man stoppar eller stryper SST-drift på ett Galera-kluster

  4. MariaDB ROUND() vs FLOOR()