U kunt dit doen door de ID's samen te voegen tot een array en die vervolgens te vergelijken met de lijst met beoogde ID's:
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'];
Het bovenstaande gaat ervan uit dat venue.id
wordt gedeclareerd als de primaire sleutel (vanwege de group by
).
U hoeft de ID's in de zoekopdracht niet echt hard te coderen als u alleen de namen van de voorzieningen wilt doorgeven:
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'));
Online voorbeeld:https://rextester.com/FNNVXO34389