すべての filter_cat_id に存在する product_id を検索しようとしています。したがって、この例では、filter_cat_id 1 2 および 3 で存在するため、product_id 30 になります。
一般に、これは product_id でグループ化し、次を使用することで実行できますHAVING COUNT(product_id) >= x
– ここで、xはカテゴリの数です。
SELECT product_id FROM table GROUP BY product_id HAVING COUNT(product_id) >= 3
(実際の数をクエリに挿入できるように) 前もってカテゴリの数がわからない場合は、サブクエリを使用してその値を取得できます。
SELECT product_id FROM table GROUP BY product_id
HAVING COUNT(product_id) >= (SELECT COUNT(DISTINCT category_id) FROM table)
編集:わかりました。検索するcategory_idsは、ある種の検索フォーム/フィルターメカニズムから来ているようです。
その場合、アイテムのフィルタリングを追加する必要があり、比較する数値を暗黙的に埋め込む必要がありますが、問題ありません。
SELECT product_id FROM table
WHERE category_id IN(1,2,3)
GROUP BY product_id
HAVING COUNT(product_id) >= 3