2013-04-10 42 views
3

根據條件選擇一些文章行時遇到問題。具有多個常見值的SQL選擇行

這裏是我的問題:我的所有文章可以有多個「標籤」連接,所以我的結構是這樣的:

articles  articles_tags  tags 
¯¯¯¯¯¯¯¯  ¯¯¯¯¯¯¯¯¯¯¯¯¯  ¯¯¯¯ 
    id   article_id   id 
    title  tag_id    name 
    content 
    [...] 

現在,我想選擇其中有兩個標籤2和3的所有文章例。我嘗試這樣做:

SELECT * FROM articles a 
JOIN articles_tags at 
    ON (a.id = at.article_id) 
WHERE 
    at.tag_id IN(2, 3) 
GROUP BY article_id 

但這將選擇至少有標籤的ID#2#3所有文章(似乎邏輯畢竟)

有什麼竅門或收穫的人只具有篇一個定義的標籤ID列表?

感謝您

+0

你想有標籤2和3可能還有其他人,或只是有標籤的物品的物品2和3,沒有其他人? – 2013-04-10 15:22:22

+0

是的,也可能是其他人。對不起,我沒有精確。 – jmpp 2013-04-10 15:23:13

回答

6

這個問題被稱爲Relational Division

SELECT a.* 
FROM articles a 
     INNER JOIN 
     (
      SELECT at.article_id 
      FROM articles a 
        INNER JOIN articles_tags at 
         ON a.id = at.article_id 
      WHERE at.tag_id IN(2, 3) 
      GROUP BY at.article_id 
      HAVING COUNT(*) = 2 
     ) b ON a.id = b.article_id 
+0

着火!謝謝,我不知道這有一個名字。 順便說一句,這是 ON a.id = b.article_id ;-) – jmpp 2013-04-10 15:31:51

+0

已更新。謝謝':D' – 2013-04-10 15:33:32