Su expresión en una cláusula WHERE funciona contra una fila única del conjunto de resultados unido. Por eso WHERE category_id = 201 AND category_id = 202
no funciona, porque no pueden ser dos valores en una sola fila.
Por lo tanto, necesita alguna forma de unir dos filas de la tabla en una fila del conjunto de resultados. Puede hacer esto con una autounión :
SELECT c1.item_id
FROM item_category AS c1
INNER JOIN item_category AS c2 ON c1.item_id = c2.item_id
WHERE c1.category_id = 201 AND c2.category_id = 202
Esta técnica es difícil de escalar cuando desea buscar tres, cuatro, cinco o más valores, porque requiere N-1 se une para coincidir con N valores.
Entonces, otro método es usar GROUP BY:
SELECT c.item_id, COUNT(*) AS cat_count
FROM item_category AS c
WHERE c.category_id IN (201,202)
GROUP BY c.item_id
HAVING cat_count = 2
Ambas técnicas están bien y funcionan mejor en diferentes circunstancias.