Проверка наличия в изображении двух разных тегов требует сравнения значений по строкам, что, в свою очередь, предполагает агрегирование:
select m.id, m.name
from medias m
inner join medias_taglinks t on t.media_id = m.id
where t.tag_id in (1, 2)
group by m.id, m.name
having min(t.tag_id) <> max(t.tag_id)
Фильтр запросов по двум поисковым тегам, агрегирует по медиа и обеспечивает что оба тега присутствуют.
В вашей скрипте базы данных это выдает:
id | name
-- | ----
1 | Media 1
Если вы хотите обработать более двух тегов, вот более общий подход c:
select m.id, m.name
from medias m
inner join medias_taglinks t on t.media_id = m.id
where t.tag_id in (1, 2, 3, 4)
group by m.id, m.name
having count(*) = 4
Предполагается, что в таблице тегов не будет дубликата (media_id, tag_id)
; в противном случае вам нужно having count(distinct t.tag_id) = 4
.
Примечание: left join
кажется ненужным; если вы хотите искать в тегах носители, вам все равно нужно привести таблицу вкладок.