2011-02-16 52 views
8

我在我的数据库中的两个表:MySQL的选择加入其中,并在

产品

  • ID(INT,主键)
  • 名(为varchar)

产品标签

  • PRODUCT_ID(INT)
  • TAG_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 

但它给了我产品具有任何给定的标签,而不是具有所有给定的标签。写WHERE tag_id = 1 AND tag_id = 2是毫无意义的,因为没有行将被返回。

+1

我不明白你在做什么?你是否在意详细说明一些数据和例子? – diagonalbatman 2011-02-16 14:36:11

回答

14

这种类型的问题称为relational division

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*/ 
+0

这解决了这个问题。我想知道最后一行代表3号。我得到正确的结果:`有计数(DISTINCT ProductTags.tag_id)= 1`和任何大小的标签id数组:`WHERE ProductTags.tag_id IN(1,2,3,4)` – Darrarski 2011-02-16 14:46:46

0

你需要有一组由/计数,以确保所有被占

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 
0

MySQL的WHERE fieldname IN (1,2,3)本质上是WHERE fieldname = 1 OR fieldname = 2 OR fieldname = 3简写。所以如果你没有得到想要的功能WHERE ... IN然后尝试切换到OR s。如果这仍然不能给你你想要的结果,那么WHERE ... IN可能不是你需要使用的功能。