SQL选择具有多个共同值的行

时间:2013-04-10 15:18:15

标签: mysql sql

我在根据条件选择一些文章行时遇到问题。

这是我的问题:我的所有文章都附加了几个“标签”,因此我的结构如下所示:

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

现在我想选择所有包含BOTH标签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

但是这会选择所有至少有AT#标签ID#2或#3的文章(毕竟看起来是逻辑)

是否有任何技巧或其他东西只能获得具有已定义标签ID列表的文章?

谢谢你

1 个答案:

答案 0 :(得分: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