Chà, đây là điều tốt nhất tôi có thể nghĩ đến vào lúc 4:30 sáng:
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))
(1, 2) là các thẻ bạn đang tìm kiếm và tất nhiên, số lượng sẽ phải khớp với số lượng thẻ bạn đang sử dụng để lọc.
Đây là ví dụ (Lưu ý rằng tôi đã thay đổi một chút dữ liệu)