通过两个标签系统过滤

时间:2019-03-04 10:00:35

标签: database postgresql database-design relational-database

我有一个post关系以及tag_system_onetag_system_two

posttag_system_onetag_system_one_post之间存在多对多关系。

posttag_system_twotag_system_two_post之间存在多对多关系。

我想要一个用于多标签搜索的SQL查询。

只有一个标签系统时,查询非常简单:

SELECT post.*
FROM post
JOIN tag_system_one_post ON post.id = tag_system_one_post.fk_post
JOIN tag_system_one ON tag_system_one_post.fk_tag_system_one = tag_system_one.id
WHERE tag_system_one.id IN (500, 533)
GROUP BY post.id
HAVING COUNT(*) = 2;

在此示例中,它检索带有两个标签500533(相交)的所有帖子。

Posts that only have tag `500` but not `533` will not be shown.

因为我正在使用COUNT(*) = 2,所以我能够执行上述声明。但这在我引入另一个标记系统(tag_system_two)时不起作用。

有没有子查询的方法吗?

1 个答案:

答案 0 :(得分:0)

考虑了一会后,我认为解决方法是:

HAVING COUNT(*) = 
no. of items selected in tagging_system_one 
MULTIPLIED BY
no. of items selected in tagging_system_two