Este é um problema de divisão relacional exato.
No SQL Server, um com bom desempenho método (assumindo restrição exclusiva em
post_id,tag
) é SELECT post_id
FROM post_tags
GROUP BY post_id
HAVING MIN(CASE
WHEN Keyword IN ( 'clever', 'interesting' ) THEN 1
ELSE 0
END) = 1
AND SUM(CASE
WHEN Keyword IN ( 'clever', 'interesting' ) THEN 1
ELSE 0
END) = 2
Então eu não descartaria a ideia de usar
GROUP_CONCAT
no HAVING
em vez de. HAVING GROUP_CONCAT(DISTINCT Keyword ORDER BY Keyword) = 'clever,interesting'