Se non ci sono vincoli univoci, prova:
SELECT post_id
FROM tags
WHERE tag_id = 1 OR tag_id = 3
GROUP BY post_id
HAVING count(DISTINCT tag_id) = 2;
Oppure usa questo HAVING
clausola, se si tenta di rilevare solo due tag_id
valori:
HAVING MIN(tag_id) <> MAX(tag_id)
Se post_id e tag_id hanno entrambi un vincolo univoco, anche questo dovrebbe funzionare:
SELECT post_id
FROM tags
WHERE tag_id = 1 OR tag_id = 3
GROUP BY post_id
HAVING count(*) = 2;