如何避免在 many-to-many sql 模型中使用子查询进行排除?
How to avoid using a subquery for exclusion in a many-to-many sql model?
假设我们有一个包含具有多对多关系的帖子和标签的模型。
例如:
帖子 table
Id
Title
HtmlContent
1
Cat eating a cucumber
...
2
Chicken flying above a cucumber
...
3
Cucumber taking revenge
...
标签 table
Id
Label
1
cat
2
chicken
3
vegetables
4
funny
PostsTags 关联 table
Id
PostId
TagId
1
1
1
1
1
3
1
1
4
2
2
2
2
2
3
2
2
4
3
3
1
3
3
3
昨天我的 objective 是为了找到 Posts
的数量,既不涉及猫又不有趣(即我不希望 Posts
与 Tags
1 或 4).
我提出的查询是这个:
select count(p.Id)
from posts p
where p.Id not in (
select postid
from poststags
where TagId in (1, 4)
group by postid
)
我想知道是否有一种方法可以在不执行任何子查询的情况下排除 many-to-many 关系中的帖子?
仅供参考,我使用的是 SQLite 数据库。
您可以使用聚合和 window 函数 COUNT()
:
SELECT DISTINCT COUNT(CASE WHEN SUM(tagid IN (1, 4)) = 0 THEN 1 END) OVER ()
FROM PostsTags
GROUP BY postid
或者,window 函数 SUM()
:
SELECT DISTINCT SUM(SUM(tagid IN (1, 4)) = 0) OVER ()
FROM PostsTags
GROUP BY postid
参见demo。
假设我们有一个包含具有多对多关系的帖子和标签的模型。
例如:
帖子 table
Id | Title | HtmlContent |
---|---|---|
1 | Cat eating a cucumber | ... |
2 | Chicken flying above a cucumber | ... |
3 | Cucumber taking revenge | ... |
标签 table
Id | Label |
---|---|
1 | cat |
2 | chicken |
3 | vegetables |
4 | funny |
PostsTags 关联 table
Id | PostId | TagId |
---|---|---|
1 | 1 | 1 |
1 | 1 | 3 |
1 | 1 | 4 |
2 | 2 | 2 |
2 | 2 | 3 |
2 | 2 | 4 |
3 | 3 | 1 |
3 | 3 | 3 |
昨天我的 objective 是为了找到 Posts
的数量,既不涉及猫又不有趣(即我不希望 Posts
与 Tags
1 或 4).
我提出的查询是这个:
select count(p.Id)
from posts p
where p.Id not in (
select postid
from poststags
where TagId in (1, 4)
group by postid
)
我想知道是否有一种方法可以在不执行任何子查询的情况下排除 many-to-many 关系中的帖子?
仅供参考,我使用的是 SQLite 数据库。
您可以使用聚合和 window 函数 COUNT()
:
SELECT DISTINCT COUNT(CASE WHEN SUM(tagid IN (1, 4)) = 0 THEN 1 END) OVER ()
FROM PostsTags
GROUP BY postid
或者,window 函数 SUM()
:
SELECT DISTINCT SUM(SUM(tagid IN (1, 4)) = 0) OVER ()
FROM PostsTags
GROUP BY postid
参见demo。