2012-04-02 15 views
8

Ho trovato molti post simili e persino cercato di scoprire come gestire i valori negativi all'interno di MySQL, ma senza successo.MySQL - Ricerca di valori di longitudine negativi con BETWEEN

Ho un sito su cui sto utilizzando Google Maps e come miglioramento delle prestazioni sto limitando i marcatori che sono tracciati sulla mappa a quelli che si trovano all'interno dei confini della mappa.

Vorrei sviluppare una query che funzionerà con i valori latitude e longitude positivi o negativi.

Per il database:

latitude FLOAT(10, 6) 
longitude FLOAT(10, 6) 

La query:

SELECT * 
FROM `table` 
WHERE `latitude` BETWEEN 47.926930 AND 47.929806 
AND `longitude` BETWEEN -97.077303 AND -97.083997 

Se mi cade la clausola BETWEEN per longitude ottengo risultati, anche se non corretta senza longitude vincolo.

Ho provato questo:

AND -`longitude` BETWEEN ABS(-97.077303) AND ABS(-97.083997) 

che fa il lavoro, ma solo per i negativi longitude valori.

Devo controllare longitude se è negativo?

+2

Quando si utilizza BETWEEN si dovrebbe avere prima il valore più basso e il secondo valore più alto. -98.083997 è inferiore a -97.077303, quindi scambia l'ordine dei due nella clausola BETWEEN. – scwagner

+0

Ah si, qualcosa di semplice e ovvio come al solito. Grazie! A volte hai solo bisogno di un altro paio di occhi. Questa sarebbe una soluzione accettabile? 'SELECT * FROM tabella DOVE latitudine TRA MENO (47,926,93 mila, 47,929,806 mila) e più grande (47,926,93 mila, 47,929,806 mila) E longitudine TRA MENO (-97,077303, -97,083997) e più grande (-97,077303, -97,083997)' – hungerstar

risposta

10

È anche possibile utilizzare i greatest() e least() funzioni, in modo da non devono preoccuparsi di parametri. Ad esempio:

SELECT * FROM table 
WHERE latitude BETWEEN least(@lat1, @lat2) AND greatest(@lat1, @lat2) 
AND longitude BETWEEN least(@lon1, @lon2) AND greatest(@lon1, @lon2) 
+0

ho appena ha trovato questa soluzione! come pubblicato sopra in un paio di risposte e commenti. Fatemi sapere cosa ne pensate! Grazie! – hungerstar

+0

Accettato poiché questo funziona per l'ordinamento corretto di "BETWEEN" che richiede il valore più basso prima del valore più alto e gestisce i valori positivi/negativi di latitudine e longitudine. – hungerstar

3

between si aspetta che il formato sia somefield BETWEEN lowervalue AND highervalue. Le tue longitudinali negative hanno i valori più alti/bassi commutati. Dovrebbe essere

AND longitude BETWEEN -97.083997 AND -97.077303 

negativo 97.08 è in realtà inferiore a quello negativo 97.07

+0

Sì, grazie. Funzionerebbe? 'SELECT * FROM tabella DOVE latitudine TRA MENO (47,926,93 mila, 47,929,806 mila) e più grande (47,926,93 mila, 47,929,806 mila) E longitudine TRA MENO (-97,077303, -97,083997) e più grande (-97,077303, -97,083997)' – hungerstar

+0

sì, dovrebbe fare bene il trucco 'least (-1, -2)' restituisce '-2', e il contrario (-1) per greatest(). –

2

Fare controllare come i numeri negativi appaiono su una linea numero. :)

SELECT * 
FROM `table` 
WHERE `latitude` BETWEEN 47.926930 AND 47.929806 
    AND `longitude` BETWEEN -97.083997 AND -97.077303 
+0

Vedo che la tua soluzione è quella del primo commento sopra, ma non così chiara. Se vuoi chiarire un po ', è più ovvio che hai scambiato i valori di longitudine che contrassegnerò come accettati.Cosa ne pensi di questa query per risolvere il problema? 'SELECT * FROM tabella DOVE latitudine TRA MENO (47,926,93 mila, 47,929,806 mila) e più grande (47,926,93 mila, 47,929,806 mila) E longitudine TRA MENO (-97,077303, -97,083997) e più grande (-97,077303, -97,083997)' – hungerstar

Problemi correlati