WHERE句の式は、単一行に対して機能します 結合された結果セットの。そのため、WHERE category_id = 201 AND category_id = 202
動作しません-1つの行に2つの値を設定できないためです。
したがって、テーブルの2つの行を結果セットの1つの行に結合する方法が必要です。これは、自己参加で行うことができます :
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 を必要とするため、3つ、4つ、5つ、またはそれ以上の値を検索する場合にスケールアップするのは困難です。 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
どちらの手法も問題なく、さまざまな状況でうまく機能します。