我在根据条件选择一些文章行时遇到问题。
这是我的问题:我的所有文章都附加了几个“标签”,因此我的结构如下所示:
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列表的文章?
谢谢你
答案 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