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

Utilizzo della clausola WHERE per trovare PDI entro un intervallo di distanza da Longitudine e Latitudine

Il problema è che non puoi fare riferimento a una colonna con alias (distance in questo caso) in un select o where clausola. Ad esempio, non puoi farlo:

select a, b, a + b as NewCol, NewCol + 1 as AnotherCol from table
where NewCol = 2

Questo fallirà in entrambi:il select istruzione quando si tenta di elaborare NewCol + 1 e anche nel where istruzione quando si tenta di elaborare NewCol = 2 .

Ci sono due modi per risolverlo:

1) Sostituire il riferimento con il valore calcolato stesso. Esempio:

select a, b, a + b as NewCol, a + b + 1 as AnotherCol from table
where  a + b = 2

2) Usa un select esterno dichiarazione:

select a, b, NewCol, NewCol + 1 as AnotherCol from (
    select a, b, a + b as NewCol from table
) as S
where NewCol = 2

Ora, data la tua colonna calcolata ENORME e non molto amichevole :) Penso che dovresti scegliere l'ultima opzione per migliorare la leggibilità:

SET @orig_lat=55.4058;  
SET @orig_lon=13.7907; 
SET @dist=10;

SELECT * FROM (
  SELECT 
    *, 
    3956 * 2 * ASIN(SQRT(POWER(SIN((@orig_lat -abs(latitude)) * pi()/180 / 2), 2) 
    + COS(@orig_lat * pi()/180 ) * COS(abs(latitude) * pi()/180) 
    * POWER(SIN((@orig_lon - longitude) * pi()/180 / 2), 2) )) as distance 
  FROM geo_kulplex.sweden_bobo
) AS S
WHERE distance < @dist
ORDER BY distance limit 10;

Modifica: Come menzionato di seguito da @Kaii, ciò risulterà in una scansione completa della tabella. A seconda della quantità di dati che elaborerai, potresti voler evitarlo e scegliere la prima opzione, che dovrebbe funzionare più velocemente.