PostGIS
Förvara inte lat och long på ett sånt bord. Använd istället en PostGIS-geometri eller geografityp .
CREATE EXTENSION postgis;
CREATE TABLE foo (
geog geography;
);
CREATE INDEX ON foo USING gist(geog);
INSERT INTO foo (geog)
VALUES (ST_MakePoint(x,y));
Nu när du behöver fråga det kan du använda KNN (<->
)
som faktiskt kommer att göra detta på ett index.
SELECT *
FROM foo
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
I din fråga har du uttryckligen HAVING distance < 5
. Du kan också göra det på indexet.
SELECT *
FROM foo
WHERE ST_DWithin(foo.geog, ST_MakePoint(x,y)::geography, distance_in_meters)
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
Detta säkerställer att ingenting returneras om alla punkter ligger utanför distance_in_meters
.
Dessutom är x och y decimaltal ST_MakePoint(46.06, 14.505)