これを行うには、IDを配列に集約し、それを目的のIDのリストと比較します。
select v.*
from venues v
join amenity_venue av ON av.venue_id = v.id
group by v.id
having array_agg(av.amenity_id) @> array['aaa', 'bbb'];
上記はvenue.id
を前提としています 主キーとして宣言されています(group by
のため) )。
アメニティ名を渡すだけの場合は、クエリでIDをハードコーディングする必要はありません。
select v.*
from venues v
join amenity_venue av ON av.venue_id = v.id
group by v.id
having array_agg(av.amenity_id) @> array(select id
from amenities
where name in ('first amenity', 'second amenity'));
オンラインの例:https://rextester.com/FNNVXO34389