2015-07-08 11 views
5

Ho 2 tabelle come gli esempi di seguito, towns e things, e ho bisogno di ottenere un elenco di città che hanno cose vicine che sono entro la distanza x da quella registrazione cittadina. Latitudine e longitudine verranno utilizzate per calcolare la distanza.Seleziona città che hanno cose vicine

Ho guardato alcune altre domande e sono riuscito a ottenere il record da things per una sola città specificata, ma non riesco a pensare come ottenere un elenco di tutte le città che hanno vicino things che sono più vicini di quanto x distanza loro.

Essere in grado di ordinare le città risultanti per numero di cose vicine entro la distanza x sarebbe un bonus.

TOWNS 
+--------+----------+---------+---------+ 
| townId | townName | townLat | townLng | 
+--------+----------+---------+---------+ 
|  1 | town a |  1.5 |  1.9 | 
|  2 | town b |  1.4 |  3.8 | 
|  3 | town c |  2.3 |  2.7 | 
|  4 | town d |  3.2 |  1.6 | 
| ... | ...  |  ... |  ... | 
+--------+----------+---------+---------+ 

THINGS 
+---------+-----------+----------+----------+ 
| thingId | thingName | thingLat | thingLng | 
+---------+-----------+----------+----------+ 
|  1 | thing a | 2.1  | 3.1  | 
|  2 | thing b | 1.1  | 2.3  | 
|  3 | thing c | 3.2  | 0.2  | 
|  4 | thing d | 1.3  | 1.1  | 
|  ... | ...  | ...  | ...  | 
+---------+-----------+----------+----------+ 

Grazie in anticipo

+0

Il grosso problema qui sta usando la formula di Haversine per determinare la distanza tra due serie di coppie di latitudine/longitudine. Hai già lavorato su questo? –

+0

Con questo schema qualsiasi soluzione diventerà molto lenta per più di qualche migliaio di righe. In pratica devi calcolare la distanza da ** ogni ** città a ** ogni ** cosa. – Vatev

+0

Non ancora - Non so da dove cominciare. Non riesco a capire come applicare la formula alle coordinate di entrambe le tabelle nella singola query. – user2959229

risposta

2

si può fare un CROSS JOIN per ottenere tutte le possibili combinazioni di città e le cose, e quindi calcolare la distanza tra ogni Haversine città e cosa. Io uso SELECT DISTINCT per assicurarmi che una città sia elencata solo una volta nel set di risultati.

SELECT DISTINCT TOWNS.townName FROM 
TOWNS CROSS JOIN THINGS 
WHERE 3959 * acos( 
    cos(radians(TOWNS.townLat)) 
* cos(radians(THINGS.thingLat)) 
* cos(radians(TOWNS.townLng) - radians(THINGS.thingLng)) 
+ sin(radians(TOWNS.townLat)) 
* sin(radians(THINGS.thingLat)) 
) < x 

La formula che ho usato è per x in miglia (il raggio medio della Terra è 3959 miglia).

+0

Questo fa quello che mi serve per ora. Grazie! – user2959229

Problemi correlati