El problema: tengo que seleccionar, para cada edificio residencial en mi mesa, que ha decir que al menos 2 de las farmacias y 2 centros de educación dentro de un radio de 1 km, todos los Poi (farmacias, centros comerciales, centros médicos, centros de enseñanza, estaciones de policía, estaciones de bomberos), que están a menos de 1 km de los edificios. estructura de la tabla->
edificio (id serial, nombre varchar )
poi_category(id serial, nombre varchar) --cname ser el nombre de la categoría de curso
pdi(id serial, nombre varchar, c_id entero)-- c_id es el FK referencia poi_category(id)
todas las coordenadas de las columnas son de tipo de geometría no geografía (vamos a llamarlos geom)
he aquí la manera en que yo pensaba que debería hacer, pero no estoy seguro de que es correcto aún no digamos la solución óptima para este problema
SELECT r.id_b, r.id_p
FROM (
SELECT b.id AS id_b, p.id AS id_p, pc.id AS id_pc,pc.cname
FROM building AS b, poi AS p, poi_category AS pc
WHERE ST_DWithin(b.geom,p.geom, 1000) AND p.c_id=pc.id
) AS r,
(
SELECT * FROM r GROUP BY id_b
) AS r1
HAVING count (
SELECT *
FROM r, r1
WHERE r1.id_b=r.id_b AND r.id_pc='pharmacy'
)>1
AND
count (
SELECT *
FROM r, r1
WHERE r1.id_b=r.id_b AND r.id_pc='ed. centre'
)>1
Es este el camino a seguir para lo que yo necesito ? ¿Qué solución sería la mejor desde un punto de vista del rendimiento? ¿Qué acerca de la solución más elegante?