sql >> Databáze >  >> RDS >> Mysql

Získejte výsledky, které spadají do okruhu značek z databáze

Abyste to mohli vyřešit, musíte porozumět rovnici kruhu, což je něco takového Aby jakýkoli bod (x,y) spadal do kruhu se středem (x1, y1) a poloměrem r jednotek je

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

where a^b = a to the power b

Zde ve vašem případě uživatele B (zeměpisná šířka, délka) je střed kruhu, uživatele A (zeměpisná šířka, délka) jsou body (x, y) a poloměr =2 km.

Ale základní problém je změna stupňů zeměpisných šířek na délky, takže zde je řešení, 1 stupeň =111,12 km. Aby byly jednotky na obou stranách rovnice stejné, převedeme je na Kms

Naše konečná rovnice tedy zní:

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

Příkaz SQL pro totéž by měl vypadat nějak takto

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

Doufám, že to pomůže...



  1. Rails, PostgreSQL a spouštěče historie

  2. Jak hledat lomítko (\) v MySQL? a proč se escapování (\) nevyžaduje pro kde (=), ale pro Like?

  3. V Oracle AS alias nefunguje

  4. Implementace hodnotícího algoritmu Hacker News v SQL