Этот запрос будет делать то, что вы ищете:
SELECT
M.id_media
FROM
media M
INNER JOIN tag_media T ON M.id_media = T.id_media
WHERE T.id_tag IN ('required1', 'required2', ... 'optional1', 'optional2', ...)
GROUP BY M.id_media
HAVING
Sum(T.id_tag IN ('required1', ... 'requiredn')) = <n>
-- where n is the required number of tags
AND Sum(T.id_tag IN ('optional1', ... 'optionaln')) >= 1
Я предпочитаю подобные конструкции, хотя, потому что тогда информация перечисляется только один раз:вы можете использовать CTE в MySQL, а затем преобразовать производную таблицу S в CTE (или поместить ее во временную таблицу) позволит вам изменить <n>
с буквального числа необходимых параметров на (SELECT Count(*) from S)
.
Примечание: технически эти запросы можно переписать так, чтобы они полностью соответствовали таблице tag_media.Но если вы хотите извлечь другую информацию из таблицы мультимедиа, то именно так вы и сделаете.