2011-02-16 61 views
3

我有我的數據庫三個表:的MySQL選擇其中但不與加入

產品

  • ID(INT,主鍵)
  • 名(爲varchar)

標籤

  • ID(INT,主鍵)
  • 名稱(VARCHAR)

ProductTags

  • PRODUCT_ID(INT)
  • TAG_ID(INT)

我正在執行SQL查詢以選擇具有給定ID的分配標籤的產品:

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

我既可以選擇無產品標籤的分配具有給定的ID:

SELECT * FROM Products 
JOIN ProductTags ON Products.id = ProductTags.product_id 
WHERE ProductTags.tag_id NOT IN (4,5,6) 
GROUP BY Products.id 

我怎麼能結合具有給定的標籤,但沒有其他標記的查詢選擇產品?我試圖做到這一點這樣:

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

但它沒有明顯的工作,給我的產品標籤(1,2,3),不管他們有標籤(4,5,6)指派或不。這可能使用一個查詢來解決這個問題嗎?

+0

第二查詢返回除了那些標記有隻有4,5或6。所有產品舉例來說,如果一個產品標記2和5,它將包含在查詢中。因此,組合第一個和第二個查詢是毫無意義的,因爲第一個查詢包含的任何產品都不會被第二個查詢排除。 – Guffa

回答

3

使用查詢中過濾掉包含不需要標籤的產品名單:

SELECT * FROM Products 
    JOIN ProductTags ON Products.id = ProductTags.product_id 
    WHERE ProductTags.tag_id IN (1,2,3) 
    AND Products.id NOT IN (SELECT product_id FROM ProductTags WHERE tag_id IN (4,5,6)) 
    GROUP BY Products.id 
+0

非常感謝,它解決了這個問題。我認爲這是不使用子查詢不能實現的,對嗎? – Darrarski

+0

不幸的是,這不完全是我所需要的。我不知道使用WHERE IN是個好主意。我想選擇標籤爲1 AND 2 AND 3,但沒有標籤4或5或6的產品。以上解決方案爲我帶標籤的產品1或2或3,無標籤4或5或6。 – Darrarski

+0

當然可以那樣做,但這不是你的問題的措辭。要包含標籤1和2,請在ProductTags表上加入兩次:在p.id = pt1.product_id和pt1.tag_id = 1上加入ProductTags pt1在p.id = pt2.product_id和pt2.tag_id = 2上加入ProductTags pt2 – Eero