sql >> Database >  >> RDS >> Mysql

De WHERE-component gebruiken om POI te vinden binnen een afstandsbereik van lengte- en breedtegraad

Het probleem is dat je niet kunt verwijzen naar een gealiaste kolom (distance in dit geval) in een select of where clausule. U kunt dit bijvoorbeeld niet doen:

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

Dit mislukt in beide:de select statement bij het verwerken van NewCol + 1 en ook in de where statement bij het verwerken van NewCol = 2 .

Er zijn twee manieren om dit op te lossen:

1) Vervang de referentie door de berekende waarde zelf. Voorbeeld:

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

2) Gebruik een buitenste select verklaring:

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

Nu, gezien je ENORME en niet erg mensvriendelijke berekende kolom :) Ik denk dat je voor de laatste optie moet gaan om de leesbaarheid te verbeteren:

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;

Bewerken: Zoals @Kaii hieronder vermeldt, resulteert dit in een volledige tafelscan. Afhankelijk van de hoeveelheid gegevens die je gaat verwerken, wil je dat misschien vermijden en voor de eerste optie gaan, die sneller zou moeten werken.



  1. SQL:hoe vind je duplicaten op basis van twee velden?

  2. Hoe een externe sleutel in SQL toe te voegen?

  3. Schadelijke, alomtegenwoordige mythes over SQL Server-prestaties

  4. php meerdere rijen invoegen in MYSQL-database