問題: 半径 1 km 以内に少なくとも 2 つの薬局と 2 つの教育センターがあるテーブル内の建物ごとに、すべての POI (薬局、商業センター、医療センター、教育センター、警察署、消防署) を選択する必要があります。 ) は、それぞれの建物から 1 km 以内にあります。テーブル構造->
建物 (ID シリアル、名前 varchar )
poi_category(id serial, cname varchar) --cname はもちろんカテゴリ名です
poi(id serial, name varchar, c_id integer)-- c_id は poi_category(id) を参照する FK です
すべての座標列は地理ではなくジオメトリ型です (geom と呼びましょう)
これが私がそれを行うべきだと思った方法ですが、この問題の最適な解決策は言うまでもなく、それが正しいかどうかもわかりません
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
これは私が必要とするものに行く方法ですか?パフォーマンスの観点から、どのソリューションが優れているでしょうか? 最もエレガントなソリューションはどうですか? ここにも投稿しました: http://gis.stackexchange.com/questions/11445/postgis-advanced-selection-query