3

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

这是我的问题:我所有的文章都可以附加多个“标签”,所以我的结构如下所示:

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 列表的文章?

谢谢

4

1 回答 1

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
于 2013-04-10T15:19:39.730 回答