Я создаю простую систему фильтрации для своего сайта. У меня есть отношение многие ко многим между местами проведения и удобствами. Вот мои столы.
ПРИМЕЧАНИЕ: все идентификаторы являются uuid. Делаем их короткими для простоты
места:
| id | name |
_________________________
| 'aaa' | 'first venue' |
| 'bbb' | 'second venue' |
| 'ccc' | 'third venue' |
удобства:
| id | name |
___________________________
| 'aaa' | 'first amenity' |
| 'bbb' | 'second amenity' |
| 'ccc' | 'third amenity' |
amenity_venue:
| amenity_id | venue_id |
______________________________
| 'aaa' | 'aaa' |
| 'bbb' | 'aaa' |
| 'ccc' | 'aaa' |
| 'aaa' | 'bbb' |
| 'bbb' | 'ccc' |
Я пытаюсь написать запрос, чтобы вернуть места, которые имеют по крайней мере все переданные в amenity_ids. Например, передавая amenity_ids aaa
и bbb
.
Выходные данные, которые я ищу, когда переданные идентификаторы удобств равны aaa
и bbb
.
| id | name |
_________________________
| 'aaa' | 'first venue' |
Сначала я попробовал этот запрос
select * from venues
INNER JOIN amenity_venue ON amenity_venue.venue_id = venues.id
where amenity_id in ('aaa', 'bbb');
Это возвращает все места, которые имеют amenity_id aaa
или bbb
.
| id | name |
_________________________
| 'aaa' | 'first venue' |
| 'bbb' | 'second venue' |
| 'ccc' | 'third venue' |
так что я наивно пытался
select * from venues
INNER JOIN amenity_venue ON amenity_venue.venue_id = venues.id
where amenity_id = 'aaa'
and amenity_id = 'bbb';
Который ничего не возвращает. Я пытаюсь написать запрос, в котором, если идентификаторы удобств aaa
и bbb
передаются только в месте проведения, возвращается значение aaa
, поскольку это единственное место, имеющее отношение к обоим удобствам. Также количество удобств меняется от запроса к запросу.