Uw expressie in een WHERE-component werkt tegen een enkele rij van de samengevoegde resultatenset. Daarom WHERE category_id = 201 AND category_id = 202
werkt niet -- omdat het niet twee waarden op een enkele rij kunnen zijn.
U hebt dus een manier nodig om twee rijen uit de tabel samen te voegen tot één rij van de resultatenset. U kunt dit doen met een self-join :
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
Deze techniek is moeilijk op te schalen als u naar drie, vier, vijf of meer waarden wilt zoeken, omdat er N-1 voor nodig is voegt zich bij N waarden.
Een andere methode is dus om GROUP BY te gebruiken:
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
Beide technieken zijn oké en werken beter in verschillende omstandigheden.