仅查找属于所有类别的条目
Find only entries that belong to all categories
在 PostgreSQL 中我有 3 个 tables:
- Table 篇文章
- Table 个类别
- 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
所有类别。
在 PostgreSQL 中我有 3 个 tables:
- Table 篇文章
- Table 个类别
- 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
所有类别。