Существует две (упрощенные) таблицы:
Свойства:
id | geog
___|_______
1 | <geog>
2 | <geog>
3 | <geog>
POI (точки интереса):
id | name | category | geog
___|______________|___________|_______
1 | X Hospital | health | <geog>
2 | Y Hospital | health | <geog>
3 | Y University | education | <geog>
4 | Z University | education | <geog>
5 | Z Restaurant | food | <geog>
6 | X Restaurant | food | <geog>
Желаемый результат:
location_id | distance_to_closest_health | distance_to_closest_education | distance_to_closest_food
____________|____________________________|_______________________________|_________________________
1 | 300 | 500 | 100
2 | 450 | 550 | 200
3 | 150 | 600 | 150
Следующий запрос работает нормально, но очень медленно (и становится медленнее в арифметической прогрессии с увеличением LIMIT
):
SELECT
properties.id AS "location_id",
(SELECT ST_Distance(pois.geog, properties.geog) FROM pois WHERE pois.category = 'health' ORDER BY ST_Distance(pois.geog, properties.geog) LIMIT 1) AS "distance_to_closest_health",
(SELECT ST_Distance(pois.geog, properties.geog) FROM pois WHERE pois.category = 'education' ORDER BY ST_Distance(pois.geog, properties.geog) LIMIT 1) AS "distance_to_closest_education",
(SELECT ST_Distance(pois.geog, properties.geog) FROM pois WHERE pois.category = 'food' ORDER BY ST_Distance(pois.geog, properties.geog) LIMIT 1) AS "distance_to_closest_food"
FROM properties
LIMIT 10;
Каков будет лучший (и более быстрый) подход для достиженияжелаемый результат?