在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类。文章2不匹配,因为它只属于类别1和2。第3条不匹配,因为它不属于任何类别。
如果我再在类别列表中添加另一个类别,就不会有文章匹配。所以查询将取决于类别表中的类别列表。
我不确定如何用一般的方法来处理。
我想过使用交叉连接,但就是因为类别表的通用性给我带来了麻烦。
你可以使用下面的查询。
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
与所有类别。