製品ごとにテーブルをグループ化し、目的の基準に一致するグループをフィルタリングする必要があります (グループ化の後にHAVING
評価される句を使用して、グループ化の前に句が評価されます)。WHERE
SELECT COUNT(*) FROM (
SELECT article_id
FROM s_a_c
WHERE category_id IN (1,6)
GROUP BY product_id
HAVING COUNT(DISTINCT category_id) = 2
) t
が一意であることが保証されている場合(product_id,category_id)
(たとえば、キーによって強制される一意性制約によって)、よりパフォーマンスの高いを の代わりにUNIQUE
使用できます。COUNT(*)
COUNT(DISTINCT category_id)
グループ フィルターでより複雑なロジックを実装する必要がある場合は、次のように、MySQL に真のブール型がないことを利用できます。
SELECT article_id
FROM s_a_c
WHERE category_id IN (1,3,6)
GROUP BY product_id
HAVING SUM(category_id = 1)
AND SUM(category_id = 6)
AND NOT SUM(category_id = 3)
WHERE
可能であれば、MySQL がインデックスを使用して完全なテーブル スキャンを回避できるようにするために、引き続き句を含めることに注意してください。