Możesz to zrobić, agregując identyfikatory w tablicę, a następnie porównując to z listą zamierzonych identyfikatorów:
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'];
Powyższe zakłada, że venue.id
jest zadeklarowany jako klucz podstawowy (ponieważ grupa group by
).
Naprawdę nie musisz zakodować identyfikatorów w zapytaniu, jeśli chcesz po prostu przekazać nazwy udogodnień:
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'));
Przykład online:https://rextester.com/FNNVXO34389