2011-02-16 85 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可能不是你需要使用的功能。