仅查找属于所有类别的条目

Find only entries that belong to all categories

在 PostgreSQL 中我有 3 个 tables:

  1. Table 篇文章
  2. Table 个类别
  3. Table 将文章映射到类别

我希望能够找到属于所有类别的文章,而不必知道存在哪些类别。

一个具体的例子:

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不匹配,因为它不属于任何类别。

如果我随后将另一个类别添加到类别列表中,将没有文章匹配。因此查询将取决于类别 table.

中的类别列表

我不确定如何以一般方式处理它。

我考虑过使用交叉连接,但类别的一般性质 table 给我带来了麻烦。

您可以使用以下查询。

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 table 中的所有类别并检查 Category_map 是否所有类别都可用,然后它只会给出 article_id所有类别。

Check Demo Here