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

Použití klauzule WHERE k nalezení POI v rozsahu vzdálenosti od zeměpisné délky a šířky

Problém je v tom, že nemůžete odkazovat na aliasový sloupec (distance v tomto případě) v select nebo where doložka. Nemůžete například udělat toto:

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

Toto selže v obou:select příkaz při pokusu o zpracování NewCol + 1 a také v where příkaz při pokusu o zpracování NewCol = 2 .

Existují dva způsoby, jak to vyřešit:

1) Nahraďte referenci samotnou vypočítanou hodnotou. Příklad:

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

2) Použijte vnější select prohlášení:

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

Nyní, vzhledem k vašemu OBROVSKÉmu a pro člověka nepříliš přátelskému vypočítanému sloupci :) Myslím, že byste měli jít pro poslední možnost, jak zlepšit čitelnost:

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;

Upravit: Jak je níže uvedeno @Kaii, výsledkem bude úplné prohledání tabulky. V závislosti na množství dat, které budete zpracovávat, se tomu možná budete chtít vyhnout a zvolit první možnost, která by měla fungovat rychleji.



  1. mysql získává last_insert_id() ve spouštěči

  2. Jak definovat primární klíč automatického zvýšení v Oracle

  3. Vytvořte inline tabulku SQL za chodu (pro vyloučení levého spojení)

  4. MySQL:součet každého dne