このタイプの問題は、関係分割と呼ばれます。 。
2つの一般的な解決策があります:
-
最初のソリューションは、一致するカテゴリをまとめて、固定文字列と比較します:
SELECT p2c.product_id FROM oc_product_to_category p2c GROUP BY p2c.product_id HAVING GROUP_CONCAT(p2c.category_id SEPARATOR ',' ORDER BY p2c.category_id) = '1,2'
-
2番目のソリューションは
JOIN
を実行します 必要な値ごとに:SELECT p.product_id FROM oc_product p INNER JOIN oc_product_to_category p2c1 ON (p.product_id = p2c1.product_id AND p2c1.category_id = 1) INNER JOIN oc_product_to_category p2c2 ON (p.product_id = p2c2.product_id AND p2c2.category_id = 2)
これらのソリューションについては、プレゼンテーション SQLクエリパターン、最適化 で説明しています。 。テストの結果、結合ソリューションの方がパフォーマンスがはるかに優れていることがわかりました。
@Tomの提案は正しいです。完全なクエリでは、次のようになります。
SELECT p.product_id, GROUP_CONCAT(p2c3.category_id SEPARATOR ',') AS categories
FROM oc_product p
INNER JOIN oc_product_to_category p2c1
ON (p.product_id = p2c1.product_id AND p2c1.category_id = 1)
INNER JOIN oc_product_to_category p2c2
ON (p.product_id = p2c2.product_id AND p2c2.category_id = 2)
INNER JOIN oc_product_to_category p2c3
ON (p.product_id = p2c3.product_id)
GROUP BY p.product_id;
DISTINCT
@Tomが提案するのは、p2cテーブルに(product_id、category_id)に対するUNIQUE制約があるため、必要ないはずです。