データベースに2つのテーブルがあります。
製品
ProductTags
すべてのタグが付いた商品を選択したい。私は試した:
SELECT
*
FROM
Products
JOIN ProductTags ON Products.id = ProductTags.product_id
WHERE
ProductTags.tag_id IN (1, 2, 3)
GROUP BY
Products.id
しかし、それは私に与えられたすべてのタグを持つのではなく、与えられたタグのいずれかを持つ製品を私に与えます。 WHERE tag_id = 1 AND tag_id = 2
は無意味です。行が返されないためです。
このタイプの問題は、 関係除算 として知られています。
SELECT Products.*
FROM Products
JOIN ProductTags ON Products.id = ProductTags.product_id
WHERE ProductTags.tag_id IN (1,2,3)
GROUP BY Products.id /*<--This is OK in MySQL other RDBMSs
would want the whole SELECT list*/
HAVING COUNT(DISTINCT ProductTags.tag_id) = 3 /*Assuming that there is a unique
constraint on product_id,tag_id you
don't need the DISTINCT*/
すべてを確実に説明するために、グループ化/カウントする必要があります
select Products.*
from Products
join ( SELECT Product_ID
FROM ProductTags
where ProductTags.tag_id IN (1,2,3)
GROUP BY Products.id
having count( distinct tag_id ) = 3 ) PreQuery
on ON Products.id = PreQuery.product_id
MySQL WHERE fieldname IN (1,2,3)
は基本的にWHERE fieldname = 1 OR fieldname = 2 OR fieldname = 3
の短縮形です。したがって、WHERE ... IN
で目的の機能が得られない場合は、OR
sに切り替えてみてください。それでも期待どおりの結果が得られない場合は、おそらくWHERE ... IN
は使用する必要のある関数ではありません。