在PostgreSQL中,我有3个表:
我希望能够找到属于所有类别的文章,而不必知道存在哪些类别。
一个具体示例:
articles categories
| id | | id | name |
+-------+ +-------+ ------+
| 1 | | 1 | cat 1 |
| 2 | | 2 | cat 2 |
| 3 | | 3 | cat 3 |
category map
| article_id | category_id |
+------------+--------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
在这种情况下,符合条件的文章仅是文章1。文章2不匹配,因为它仅属于类别1和2。文章3不匹配,因为它不属于任何类别
如果我随后将另一个类别添加到类别列表中,则没有文章匹配。因此,查询将取决于类别表中的类别列表。
我不确定如何以一般方式进行处理。
我曾考虑过使用交叉联接,但这是类别表的一般性质,这给我带来了麻烦。
答案 0 :(得分:2)
您可以使用以下查询。
SELECT ARTICLE_ID FROM CATEGORY_MAP
WHERE CATEGORY_ID IN (SELECT ID FROM CATEGORIES)
GROUP BY ARTICLE_ID
HAVING COUNT(DISTINCT CATEGORY_ID) = (SELECT COUNT(*) FROM CATEGORIES);
正如您提到的,这将从categories
表中获取所有类别,并检查Category_map
是否全部可用,然后仅给出具有所有类别的article_id
。