PostGIS
Ne rangez pas lat et long sur une table comme ça. Utilisez plutôt une géométrie PostGIS ou un type de géographie .
CREATE EXTENSION postgis;
CREATE TABLE foo (
geog geography;
);
CREATE INDEX ON foo USING gist(geog);
INSERT INTO foo (geog)
VALUES (ST_MakePoint(x,y));
Désormais, lorsque vous devez l'interroger, vous pouvez utiliser KNN (<->
)
qui le fera réellement sur un index.
SELECT *
FROM foo
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
Dans votre requête, vous avez explicitement HAVING distance < 5
. Vous pouvez également le faire sur l'index.
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;
Cela garantit que rien n'est renvoyé si tous les points se trouvent en dehors de distance_in_meters
.
De plus x et y sont des nombres décimaux ST_MakePoint(46.06, 14.505)