MySQL选择join-where和where

MySQL选择join-where和where,mysql,join,where-in,relational-division,Mysql,Join,Where In,Relational Division,我的数据库中有两个表: 产品 id int,主键 名称varchar 产品标签 产品标识int 标记id int 我想选择具有所有给定标签的产品。我试过: SELECT * FROM Products JOIN ProductTags ON Products.id = ProductTags.product_id WHERE ProductTags.tag_id IN (1, 2, 3) GROUP BY Products.id 但它给我的产品有任何给定的标签,

我的数据库中有两个表:

产品

id int,主键 名称varchar 产品标签

产品标识int 标记id int 我想选择具有所有给定标签的产品。我试过:

SELECT
    *
FROM
    Products
JOIN ProductTags ON Products.id = ProductTags.product_id
WHERE
    ProductTags.tag_id IN (1, 2, 3)
GROUP BY
    Products.id

但它给我的产品有任何给定的标签,而不是所有给定的标签。在tag_id=1和tag_id=2的位置写入是没有意义的,因为不会返回任何行。

这种类型的问题称为


您需要有一个分组依据/计数,以确保所有记录都已记录

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 

1,2,3中的MySQL WHERE fieldname本质上是fieldname=1或fieldname=2或fieldname=3的缩写。因此,如果您在何处无法获得所需的功能。。。然后尝试切换到ORs。如果这仍然不能给你想要的结果,那么也许在哪里。。。IN不是您需要使用的功能。

我不明白您想要什么?你想用一些数据和例子来阐述吗?这就解决了问题。我不知道最后一行数字3代表什么。我得到了正确的结果:COUNTDISTINCT ProductTags.tag_id=1和任意大小的tags id数组:其中ProductTags.tag_id在1,2,3,4中,您需要根据需要调整3。对于1,2,3,4,您需要使用COUNTDISTINCT ProductTags.tag_id=4,否则您将从4个匹配标记中恢复具有任何3个匹配标记的标记。
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