Я создаю простую систему фильтрации для моего сайта.У меня есть много-много отношений между местами и удобствами.Вот мои таблицы.
ПРИМЕЧАНИЕ: все идентификаторы - это uuids.Сокращая их для простоты
места проведения:
| 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
.
Вывод Я ищу, когда переданные идентификаторы amenity равны 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';
Что ничего не возвращает.Я пытаюсь написать запрос, в котором если amenity_ids aaa
и bbb
передаются только в место, возвращается aaa
, поскольку это единственное место, которое имеет отношение к обоим удобствам.Также количество удобств является динамическим от запроса к запросу.