Twoje wyrażenie w klauzuli WHERE działa na pojedynczy wiersz połączonego zestawu wyników. Dlatego WHERE category_id = 201 AND category_id = 202
nie działa - ponieważ nie może być dwóch wartości w jednym wierszu.
Potrzebujesz więc sposobu, aby połączyć dwa wiersze z tabeli w jeden wiersz zestawu wyników. Możesz to zrobić za pomocą samodołączenia :
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
Ta technika jest trudna do skalowania, gdy chcesz wyszukać trzy, cztery, pięć lub więcej wartości, ponieważ wymaga N-1 łączy, aby dopasować N wartości.
Więc inną metodą jest użycie 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
Obie techniki są w porządku i działają lepiej w różnych okolicznościach.