Вашият израз в клауза WHERE работи срещу единичен ред от обединения набор от резултати. Ето защо WHERE category_id = 201 AND category_id = 202
не работи -- защото не може да има две стойности на един ред.
Така че имате нужда от някакъв начин да обедините два реда от таблицата в един ред от набора от резултати. Можете да направите това ссамоприсъединяване :
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
Тази техника е трудна за увеличаване, когато искате да търсите три, четири, пет или повече стойности, защото изисква N-1 присъединява, за да съответства на N стойности.
Така че друг метод е да използвате 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
И двете техники са наред и работят по-добре при различни обстоятелства.