只查找属于所有类别的条目[重复]

问题描述 投票:0回答:1

在PostgreSQL中,我有3张表。

  1. 文章表
  2. 类别表
  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条不匹配,因为它不属于任何类别。

如果我再在类别列表中添加另一个类别,就不会有文章匹配。所以查询将取决于类别表中的类别列表。

我不确定如何用一般的方法来处理。

我想过使用交叉连接,但就是因为类别表的通用性给我带来了麻烦。

sql database postgresql nested-queries relational-division
1个回答
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 与所有类别。

点击这里查看演示

© www.soinside.com 2019 - 2024. All rights reserved.