Nun, das ist das Beste, was mir um 4:30 Uhr einfällt:
SELECT distinct tag_id FROM
(SELECT pt1.post_id FROM pt1
INNER JOIN tags t1 ON (pt1.tag_id = t1.id)
WHERE t1.id IN (1, 2)
GROUP BY pt1.post_id
HAVING COUNT(DISTINCT t1.id) = 2) MatchingPosts
INNER JOIN pt2 ON (MatchingPosts.post_id = pt2.post_id)
WHERE (pt2.tag_id NOT IN (1, 2))
Die (1, 2) sind die Tags, nach denen Sie suchen, und die Anzahl muss natürlich mit der Anzahl der Tags übereinstimmen, die Sie zum Filtern verwenden.
Hier ist ein Beispiel (Beachten Sie, dass ich die Daten leicht geändert habe)