Váš výraz v klauzuli WHERE funguje proti jednomu řádku ze spojené výsledkové sady. Proto WHERE category_id = 201 AND category_id = 202
nefunguje -- protože na jednom řádku nemohou být dvě hodnoty.
Takže potřebujete nějaký způsob, jak spojit dva řádky z tabulky do jednoho řádku sady výsledků. Můžete to udělat pomocí vlastního připojení :
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
Tuto techniku je těžké zvětšit, když chcete hledat tři, čtyři, pět nebo více hodnot, protože vyžaduje N-1 se připojí, aby odpovídal N hodnoty.
Další metodou je tedy použití 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
Obě techniky jsou v pořádku a fungují lépe za různých okolností.