Я сделал некоторые предположения о других ваших столах. (т. е. у вас есть таблица для сообщений, которые я назвал posts
, и таблица с tag_id в качестве PK, которую я назвал tag_table
, чтобы избежать столкновения имен с таблицей posts / tags, которую, как я вижу, вы уже вызываете tags
)
Вам нужны сообщения, в которых нет тега в списке {1,3}, для которого не существует соответствующей записи с соответствующим post_id / tag_id, поэтому вы можете использовать двойную конструкцию NOT EXISTS, как показано ниже.
SELECT post_id
FROM posts p
WHERE NOT EXISTS
(SELECT * FROM tag_table tt
WHERE tag_id IN (1,3)
AND NOT EXISTS
(SELECT * FROM tags t
WHERE t.tag_id = tt.tag_id and
p.post_id = t.post_id)
)
Другой альтернативный подход - использовать Group By и Count. Обзор подходов к этой проблеме здесь .