Zakładając, że chcesz czegoś więcej niż tylko identyfikatora artykułu:
SELECT a.id
,a.other_stuff
FROM articles a
JOIN article_category ac
ON ac.article_id = a.id
GROUP BY a.id
HAVING GROUP_CONCAT(DISTINCT ac.category_id ORDER BY ac.category_id SEPARATOR ',') = '1,2'
Jeśli potrzebujesz tylko identyfikatora artykułu, spróbuj tego:
SELECT article_id
FROM article_category
GROUP BY article_id
HAVING GROUP_CONCAT(DISTINCT category_id ORDER BY category_id SEPARATOR ',') = '1,2'
Zobacz w akcji na http://sqlfiddle.com/#!2/9d213/4
Należy również dodać, że zaletą tego podejścia jest możliwość obsługi sprawdzania dowolnej liczby kategorii bez konieczności zmiany zapytania. Po prostu ustaw '1,2' jako zmienną łańcuchową i zmień to, co jest przekazywane do zapytania. Możesz więc równie łatwo wyszukiwać artykuły z kategoriami 1, 2 i 7, przekazując ciąg „1,2,7”. Nie są potrzebne żadne dodatkowe połączenia.