Ditt uttryck i en WHERE-sats fungerar mot en enkel rad av den sammanslagna resultatuppsättningen. Det är därför WHERE category_id = 201 AND category_id = 202
fungerar inte -- eftersom det inte kan vara två värden på en enda rad.
Så du behöver ett sätt att sammanfoga två rader från tabellen till en rad i resultatuppsättningen. Du kan göra detta med en självanslutning :
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
Den här tekniken är svår att skala upp när du vill söka efter tre, fyra, fem eller fler värden, eftersom den kräver N-1 går med för att matcha N värden.
Så en annan metod är att använda 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
Båda teknikerna är okej och fungerar bättre under olika omständigheter.