2013-04-10 41 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