Вы можете использовать оператор расстояния до (<->
) в сочетании с агрегатной функцией MIN
, чтобы найти ближайшее расстояние, тем самым уменьшая проблему с поиском других столбцов для строки с минимальным количеством .Строго слева / справа от / выше / ниже операторов (<<
, >>
, |>>
, <<|
) можно использовать для ограничения точек одной стороной поля.Поскольку две разные точки могут иметь одинаковое расстояние, мы ограничим результат 1 строкой.Предполагая ориентацию экрана, где координаты увеличиваются вниз и вправо (вместо ориентации карты, которая увеличивает север и восток), мы получаем:
-- Above, or North
SELECT * FROM ch WHERE loc <<| screen AND (loc <-> screen) = (
SELECT MIN(loc <-> screen) AS mindist FROM ch
WHERE loc <<| screen
) LIMIT 1
-- Right, or East
SELECT * FROM ch WHERE loc >> screen AND (loc <-> screen) = (
SELECT MIN(loc <-> screen) AS mindist FROM ch
WHERE loc >> screen
) LIMIT 1
-- Below, or South
SELECT * FROM ch WHERE loc |>> screen AND (loc <-> screen) = (
SELECT MIN(loc <-> screen) AS mindist FROM ch
WHERE loc |>> screen
) LIMIT 1
-- Left, or West
SELECT * FROM ch WHERE loc << screen AND (loc <-> screen) = (
SELECT MIN(loc <-> screen) AS mindist FROM ch
WHERE loc << screen
) LIMIT 1
Обратите внимание, что ближайшая точка в горизонтальном направлении также может бытьближайшая точка в вертикальном направлении;то есть объединение вышеупомянутых четырех операторов может быть меньше четырех строк.
Мы можем получить четыре ближайших точки с помощью:
SELECT *, (loc <-> screen) AS distance FROM ch
WHERE NOT loc <@ screen
ORDER BY distance
LIMIT 4
Однако обратите внимание, что некоторые из ближайших точекможет быть в одном направлении друг с другом.
Мы можем получить ближайшую точку в целом с помощью
SELECT *, (loc <-> screen) AS distance FROM ch
WHERE distance = (
SELECT MIN(loc <-> screen) AS mindist FROM ch
)
LIMIT 1
или
SELECT *, (loc <-> screen) AS distance FROM ch
WHERE NOT loc <@ screen
ORDER BY distance
LIMIT 1
При расчете минимума (или максимума) столбца, первый будет предпочтительным, поскольку СУБД может использовать индекс для столбца (если есть) и не нужно сканировать таблицу.Поскольку расстояние является расчетным значением, сканирование таблицы всегда необходимо, и запросы будут иметь аналогичную производительность. анализ запросов может вызвать какую-то другую причину, чтобы предпочесть утверждение, поэтому вы должны сделать это до выбора подхода.